Приведем пример системы "клиент-сервер", реализованной с использованием каналов протокола NETBIOS (листинг 22).
После запуска программа-сервер создает объект класса NETBIOS_SESSION_SERVER. Конструктор этого объекта проверяет присутствие интерфейса NETBIOS, добавляет имя, переданное ему в качестве параметра, затем создает канал при помощи функции WListen().
Деструктор класса NETBIOS_SESSION_SERVER перед удалением имени удаляет канал, так как имя нельзя удалить, если оно используется каким-либо каналом.
После того, как отработал конструктор, программа-сервер проверяет ошибки и вызывает функцию Receive(), которая ожидает приема данных по созданному каналу. После приема сервер отображает принятые данные как текстовую строку и завершает свою работу.
// =================================================== // Листинг 22. Сервер NETBIOS, вариант с // использованием каналов // // Файл nbserver.cpp // // (C) A. Frolov, 1993 // ===================================================
#include <stdio.h> #include <stdlib.h> #include <dos.h> #include <conio.h> #include <mem.h> #include <string.h> #include "netbios.hpp"
// Класс серверов NETBIOS
class NETBIOS_SESSION_SERVER {
unsigned errno; void interrupt ( *int5C)(...);
public:
// Здесь хранится имя сервера и номер этого имени
char OurName[16]; unsigned NetworkNameNumber;
// Блок NCB, который будет использован при добавлении имени
NCB AddNameNCB;
// Конструктор, проверяет наличие NETBIOS и добавляет имя
NETBIOS_SESSION_SERVER(char *Name) {
// Проверяем длину имени имя
if(strlen(Name) > 15) { errno = 0xff; return; } strcpy(OurName, Name);
// Проверяем наличие интерфейса NETBIOS
int5C = getvect(0x5c); errno = 0; if(FP_SEG(int5C) == 0x0000 FP_SEG(int5C) == 0xF000) { errno=0xff; exit(-1); }
// Добавляем имя
AddNameNCB.WAddName(OurName);
// Запоминаем полученный номер имени
NetworkNameNumber = AddNameNCB.GetNetworkNameNumber(); errno = AddNameNCB.Error(); if(errno) return;