Скачиваний:
59
Добавлен:
01.05.2014
Размер:
318.98 Кб
Скачать

Обратим еще раз ваше внимание на то, что, даже если код завершения в поле CCode равен нулю, это не гарантирует успешной доставки пакета адресату.

Из-за чего пакет может не дойти до адресата? Во-первых, пакет может быть потерян в процессе передачи по кабелю. Во-вторых, станция, адрес которой указан в заголовке пакета, может не работать или такой станции может вообще не быть в указанной сети. В-третьих, станция-адресат может не ожидать пакет на указанном сокете.

Одна из интересных особенностей при передаче пакетов заключается в том, что вы можете передавать пакеты "сами себе", т. е. передающая и принимающая программы могут работать на одной и той же станции и использовать один и тот же сокет.

Поле Socket

Cодержит номер гнезда, связанный с данным ECB. Если ECB используется для приема, это поле содержит номер гнезда, на котором выполняется прием пакета. Если же ECB используется для передачи, это поле содержит номер гнезда передающей программы. Заполняется в прикладной программе и используется протоколом IPX для заполнения поля SourceSocket пакета IPX.

Поле IPXWorkspace

Зарезервировано для использования драйвером IPX.

Поле DriverWorkspace

Зарезервировано для использования драйвером сетевого адаптера.

Поле ImmAddress

Поле ImmAddress (Immediate Address - непосредственный адрес) содержит адрес узла в сети, в который будет направлен пакет. Если пакет передается в пределах одной сети, поле ImmAddress будет содержать адрес станции- получателя (такой же, как и в заголовке пакета IPX). Если же пакет предназначен для другой сети и будет проходить через мост, поле ImmAddress будет содержать адрес этого моста в сети, из которой передается пакет.

Поле FragmentCnt

Устанавливается прикладной программой и содержит количество фрагментов, на которые надо разбить принятый пакет или из которых надо собрать передаваемый пакет, т.е. в программе можно указать отдельные буферы для приема/передачи заголовка и данных пакета. В этом случае значение поля FragmentCnt должно быть равно 2.

Значение, записанное в поле FragmentCnt, не должно быть равно нулю. Если в этом поле записано значение 1, весь пакет вместе с заголовком записывается в один общий буфер.

Сразу вслед за полем FragmentCnt располагаются дескрипторы фрагментов, состоящие из указателя в формате [сегмент:смещение] на фрагмент Address и поля размера фрагмента Size.

Если программе надо разбить принятый пакет на несколько частей, она должна установить в поле FragmentCnt значение, равное количеству требуемых фрагментов. Затем для каждого фрагмента необходимо создать дескриптор, в котором указать адрес буфера и размер фрагмента. Аналогичные действия выполняются и при сборке пакета перед передачей из нескольких фрагментов.

Самый первый фрагмент не должен быть короче 30 байт, так как там должен поместиться заголовок пакета IPX.