// ===================================================
// Листинг 18. Сервер 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_DATAGRAM_SERVER {

	unsigned errno;
	void interrupt ( *int5C)(...);

public:

// Здесь хранится имя сервера
// и номер этого имени

	char OurName[16];
	unsigned NetworkNameNumber;

// Конструктор, проверяет наличие NETBIOS
// и добавляет имя

	NETBIOS_DATAGRAM_SERVER(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;
		}

// Добавляем имя

		AddNameNCB.WAddName(OurName);

// Запоминаем полученный номер имени

		NetworkNameNumber = AddNameNCB.GetNetworkNameNumber();
		errno = AddNameNCB.Error();
	}

// Деструктор, удаляет имя.

	~NETBIOS_DATAGRAM_SERVER() {
		NCB AddNameNCB;
		AddNameNCB.WDeleteName(OurName);
		errno = AddNameNCB.Error();
	}

// Функция для проверки кода ошибки

	int Error(void) {return errno;}

// Функция для приема датаграммы

	void Receive(char *ReceiveBuffer, unsigned BufferSize) {
		NCB ReceiveNCB;

// Записываем в NCB адрес и длину буфера

		ReceiveNCB.SetBuffer(ReceiveBuffer, BufferSize);

// Выполняем прием датаграммы с ожиданием

		ReceiveNCB.WReceiveDatagram(NetworkNameNumber);

	}
};

void main(void) {

// Наш сервер с именем "NETBIOS Server"

	NETBIOS_DATAGRAM_SERVER Server("NETBIOS Server");
	char ReceiveBuffer[512];

// Проверяем, были ли ошибки на этапе
// инициализации сервера.

	if(Server.Error()) {
		printf("Ошибка %02.2X\n", Server.Error());
		return;
	}
	printf("Инициализация завершена.\n");
	printf("Ожидаем сообщение от клиента.\n");

// Принимаем сообщение от клиента

	Server.Receive(ReceiveBuffer, 512);
	printf("Принято: >%s<\n",ReceiveBuffer);

}