// ===================================================
// Листинг 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;
	void interrupt ( *int5C)(...);

public:

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

	char OurName[16];
	unsigned NetworkNameNumber;

// Конструктор, проверяет наличие 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;
		}

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

		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;

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

		ReceiveNCB.SetBuffer(ReceiveBuffer, BufferSize);

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

		ReceiveNCB.WReceiveDatagram(NetworkNameNumber);

	}

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

	void Send(char *ReceiveBuffer, unsigned BufferSize,
					char *CallName) {
		NCB SendNCB;

// Устанавливаем адрес и длину буфера

		SendNCB.SetBuffer(ReceiveBuffer, BufferSize);

// Устанавливаем имя партнера, которому будет передана
// наша датаграмма

		SendNCB.SetCallName(CallName);

// Передаем датаграмму с ожиданием

		SendNCB.WSendDatagram(NetworkNameNumber);
	}
};

void main(void) {

// Наш клиент с именем "NETBIOS Client"

	NETBIOS_DATAGRAM_CLIENT Client("NETBIOS Client");

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

	if(Client.Error()) {
		printf("Ошибка %02.2X\n", Client.Error());
		return;
	}
	printf("Инициализация завершена.\n");

// Передаем сообщение серверу с именем "NETBIOS Server"

	Client.Send("Привет от клиента NETBIOS!", 512, "NETBIOS Server");

}