SPXEstablishConnection
На входе: | BX | = | 11h. |
AL | = | Счетчик повторов попыток создать канал связи. | |
AH | = | Флаг включения системы периодической проверки связи (Watchdog Supervision Required Flag). | |
ES:SI | = | Указатель на блок ECB. | |
На выходе: | AL | = | Промежуточный код завершения: 00h - выполняется попытка создать канал; FFh - указанный в блоке ECB сокет закрыт; FDh - сбойный пакет: либо счетчик фрагментов не равен 1, либо размер фрагмента не равен 42; EFh - переполнение локальной таблицы номеров каналов связи. |
DX | = | Присвоенный номер канала. |
Функция устанавливает канал связи с программой, предварительно вызвавшей функцию SPXListenForConnection.
Для функции необходимо подготовить блок ECB и пакет в формате SPX, состоящий из одного заголовка. В блоке ECB необходимо заполнить поля ESRAddress, Socket, счетчик количества фрагментов (нужен один фрагмент) и указатель на фрагмент размером 42 байта. В заголовке SPX-пакета необходимо заполнить поля DestNetwork, DestNode, DestSocket.
Кроме того, перед вызовом функции SPXListenForConnection программа должна выделить хотя бы один ECB для приема SPX-пакета. Это нужно сделать при помощи функции SPXListenForSequencedPacket (см. ниже описание функции).
Канал создается в два приема.
На первом этапе проверяется возможность образования канала - проверяется наличие свободного места в таблице номеров каналов, проверяется таблица сокетов, размер пакета. Если все хорошо, с целью попытки создать канал удаленному партнеру посылается пакет, после чего функция возвращает управление вызвавшей ее программе. Регистр AL при этом содержит промежуточный код завершения. Если этот код равен нулю, можно переходить к ожиданию приема ответного пакета от партнера по созданию канала. Регистр DX при этом содержит номер присвоенного канала.
Если партнер отвечает соответствующим образом, в поле InUse блока ECB устанавливается нулевое значение. Если при этом в поле CCode также находится нулевое значение, канал считается созданным.
Номер канала удаленного партнера, который вы будете использовать для передачи ему пакетов функцией SPXSendSequencedPacket, находится в поле SourceConnID блока ECB.
Сохраните его для дальнейшего использования.
Если по каким-либо причинам канал создать не удалось, в поле CCode будет записан код ошибки:
00h | канал связи создан, ошибок нет; |
FCh | запрос SPXListenForConnection был отменен функциями IPXCancelEvent или IPXCloseSocket (ESR не вызывается); |
FDh | сбойный пакет: либо счетчик фрагментов не равен единице, либо размер фрагмента не равен 42; |
FFh | указанный в ECB сокет не был открыт; |
EFh | переполнилась внутренняя таблица номеров каналов связи; до тех пор, пока какой-нибудь канал не будет закрыт, вы не сможете образовать новые каналы; |
EDh | адресат не отвечает или сообщает, что он не может создать канал; этот код может возникнуть либо как результат неисправности сетевого аппаратного обеспечения, либо если функция SPXEstablishConnection была отменена при помощи функции SPXAbortConnection. |
димо пользоваться специально предназначенной для этого функцией SPXAbortConnection, а не функцией IPXCancelEvent.