Локальные сети персональных компьютеров Использование протоколов IPX, SPX, NETBIOS


Простая система "клиент-сервер" - часть 2


Приняв пакет, сервер подготавливает еще один блок ECB для передачи ответного пакета. Фактически сервер будет использовать тот же самый блок ECB, что и для приема. Поле непосредственного адреса в блоке ECB уже содержит адрес клиента, так как когда драйвер IPX принял пакет, он записал фактическое значение непосредственного адреса в соответствующее поле блока ECB. Для того, чтобы использовать блок ECB для передачи, нам достаточно изменить дескрипторы фрагментов - они должны указывать на заголовок передаваемого пакета и на буфер, содержащий передаваемые данные.

В качестве передаваемых данных сервер использует буфер TxBuffer с записанной в него текстовой строкой "SERVER *DEMO*". Эта строка будет выведена клиентом на консоль после приема от сервера ответного пакета.

Подготовив блок ECB для передачи, программа ставит его в очередь на передачу при помощи функции IPXSendPacket(), после чего закрывает сокет и завершает свою работу.

// =================================================== // Листинг 4. Сервер IPX // // Файл ipxserv.c // // (C) A. Frolov, 1993 // ===================================================

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <mem.h> #include <string.h> #include "ipx.h"

#define BUFFER_SIZE 512

void main(void) {

// Используем сокет 0x4567

static unsigned Socket = 0x4567;

// Этот ECB мы будем использовать и для приема // пакетов, и для их передачи.

struct ECB RxECB;

// Заголовки принимаемых и передаваемых пакетов

struct IPX_HEADER RxHeader, TxHeader;

// Буферы для принимаемых и передаваемых пакетов

unsigned char RxBuffer[BUFFER_SIZE]; unsigned char TxBuffer[BUFFER_SIZE];

printf("\n*Сервер IPX*, (C) Фролов А., 1993\n\n");

// Проверяем наличие драйвера IPX и определяем // адрес точки входа его API

if(ipx_init() != 0xff) { printf("IPX не загружен!\n"); exit(-1); }

// Открываем сокет, на котором мы будем принимать пакеты

if(IPXOpenSocket(SHORT_LIVED, &Socket)) { printf("Ошибка при открытии сокета\n"); exit(-1); };




- Начало -  - Назад -  - Вперед -



Книжный магазин