}
Программа-сервер работает в паре с программой-клиентом (листинг 19).
После запуска программа-клиент создает объект класса NETBIOS_DATAGRAM_CLIENT. Конструктор и деструктор этого класса выполняют действия, аналогичные конструктору и деструктору класса NETBIOS_DATAGRAM_SERVER.
После инициализации и проверки ошибок программа-клиент посылает сообщение "Привет от клиента NETBIOS!" серверу с именем "NETBIOS Server" при помощи функции Send(). Затем программа-клиент завершает свою работу.
// =================================================== // Листинг 19. Клиент NETBIOS, вариант с // использованием датаграмм // // Файл nbclient.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_DATAGRAM_CLIENT {
unsigned errno;
public:
// Здесь хранится имя клиента и номер этого имени
char OurName[16]; unsigned NetworkNameNumber; union REGS regs;
// Конструктор, проверяет наличие NETBIOS и добавляет имя
NETBIOS_DATAGRAM_CLIENT(char *Name) {
// Блок NCB, который будет использован при добавлении имени
NCB AddNameNCB;
// Проверяем длину имени имя
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(); }
// Деструктор, удаляет имя.
~NETBIOS_DATAGRAM_CLIENT() { NCB AddNameNCB; AddNameNCB.WDeleteName(OurName); errno = AddNameNCB.Error(); }
// Функция для проверки кода ошибки
int Error(void) {return errno;}
// Функция для приема датаграммы
void Receive(char *ReceiveBuffer, unsigned BufferSize) { NCB ReceiveNCB;