Формат пакета SPX
Пакет, передаваемый при помощи протокола SPX, имеет более длинный заголовок. Дополнительно к 30 байтам стандартного заголовка пакета IPX добавляется еще 12 байт (рис. 4).
Рис. 4. Формат заголовка пакета SPX
Приведем структуру заголовка пакета SPX для использования в программах, составленных на языке Си:
struct SPX_HEADER { unsigned int Checksum; unsigned int Length; unsigned char TransportControl; unsigned char PacketType; unsigned char DestNetwork[4]; unsigned char DestNode[6]; unsigned int DestSocket; unsigned char SourceNetwork[4]; unsigned char SourceNode[6]; unsigned int SourceSocket; // ------------Специфическая для SPX часть --------- unsigned char ConnControl; unsigned char DataStreamType; unsigned char SourceConnID[2]; unsigned char DestConnID[2]; unsigned char SequenceNumber[2]; unsigned char AckNumber[2]; unsigned char AllocationNumber[2]; };
Поле ConnControl можно рассматривать как набор битовых флагов, управляющих передачей данных по каналу SPX:
Биты | Назначение |
01h-08h | Зарезервировано |
10h | End-of-Message. Этот бит может использоваться программой для сигнализации окончания передачи данных. Драйвер SPX передает этот бит программе в неизменном виде, причем сам драйвер протокола SPX этот бит игнорирует |
20h | Attention. Этот бит игнорируется драйвером SPX и передается в неизменном виде программе |
40h | Acknowledgement Required. Бит используется драйвером SPX. Вам не следует модифицировать его значение |
80h | System Packet. Этот бит устанавливается драйвером SPX при передаче системных пакетов, которые используются самим драйвером и не передаются в программу пользователя |
Поле DataStreamType также состоит из однобитовых флагов, которые используются для классификации данных, передаваемых или принимаемых при помощи протокола SPX. Приведем возможные значения поля DataStreamType:
Биты | Назначение |
00h-FDh | Эти значения игнорируются драйвером SPX и могут быть использованы программой произвольным образом |
FEh | End-of-Connection. Когда программа вызывает функцию, закрывающую SPX-канал, драйвер SPX посылает партнеру по связи последний пакет, в поле DataStreamType которого записано значение FEh. Это служит требованием завершить связь и закрыть канал |
FFh | End-of-Connection-Acknowledgement. Это значение отмечает пакет, подтверждающий завершение связи. Такой пакет является системным и не передается в программу пользователя |
Поле SourceConnID содержит номер канала связи передающей программы, присвоенный драйвером SPX при создании канала связи. Этот номер должен указываться функции передачи пакета средствами SPX.
Поле DestConnID содержит номер канала связи принимающей стороны. Так как все пакеты приходят на один номер сокета и могут принадлежать разным каналам связи (на одном сокете можно открыть несколько каналов связи), вам необходимо классифицировать приходящие пакеты по номеру канала связи.
Поле SeqNumber содержит счетчик пакетов, переданных по каналу в одном направлении. На каждой стороне канала используется свой счетчик. После достижения значения FFFFh счетчик сбрасывается в нуль, после чего процесс счета продолжается.
Содержимым этого поля управляет драйвер SPX, поэтому программа не должна менять его значение.
Поле AckNumber содержит номер следующего пакета, который должен быть принят драйвером SPX.
Содержимым этого поля управляет драйвер SPX, поэтому программа не должна менять его значение.
Поле AllocNumber содержит количество буферов, распределенных программой для приема пакетов.
Содержимым этого поля управляет драйвер SPX, поэтому программа не должна менять его значение.