Интегрированные сети ISDN

         

Указатель на структуру типа для команды getpeername



Рисунок 7.5. Указатель на структуру типа для команды getpeername


AF - идентифицирует семейство протоколов (для TCP/IP=2), для которого порожден данный соединитель, вся структура занимает 16 октетов. addrlen - указатель на переменную, куда будет записана длина адреса. Соединитель может быть выключен командой close(s), где s идентификатор соединителя, который надлежит закрыть. Если пользователь не хочет более посылать или получать данные, он может выдать команду shutdown(s, how), где параметр how может принимать значения: 0 - блокируется прием данных; 1 - блокируется передача данных; 3 - блокируются любые обмены.

Каждое соединение должно иметь свой неповторимый код ISN (Initial Sequence Number). Этот код посылается клиентом серверу с помощью сегмента SYN. Для реализации режима соединения прикладная программа на одном конце канала устанавливается в режим пассивного доступа ("passive open"), а операционная система на другом конце ставится в режим активного доступа ("active open"). Протокол TCP предполагает реализацию 11 состояний (ESTABLISHED, CLOSED, LISTEN, SYN_SENT, SYN_RCVD и т.д.), переход между которыми строго регламентирован (смотри раздел 4.4.3).

При написании диагностических и управляющих программ под Windows 95 или NT можно использовать простые соединители (Sock_Raw) или библиотеку ICMP.DLL (эта динамическая библиотека не является частью Win32 API). Библиотека ICMP.DLL содержит в частности процедуру ICMPSendEcho, которая посылает запросы эхо по указанному адресу и возвращает отклик в пределах указанного временного интервала. В качестве аргументов запрос ICMPSendEcho использует ICMP-дескриптор, который получается в результате запроса IcmpCreateFile.

HANDLE WINAPI IcmpCreateFile(VOID);

/* Оператор создает ICMP-дескриптор; при ошибке возвращает INVALID_HANDLE_VALUE */

BOOL WINAPI IcmpCloseHandle(HANDLE IcmpHandle);

/* Оператор ликвидирует ICMP-дескриптор; при возникновении ошибки возвращает значение FALSE */

Обращение к процедуре посылки ICMP запроса эхо имеет формат:



DWORD WINAPI IcmpSendEcho(

HANDLE IcmpHandle,

/* дескриптор, полученный в результате запроса IcmpCreateFile */



u_long DestAddress, /* IP адрес точки зондирования */
LPVOID RequestData,

/* указатель на буфер, где лежат данные, подлежащие посылке */
WORD RequestSize, /* длина этого буфера */
LPIPINFO RequestOptns, /* указатель на структуру ICMP-опций */
LPVOID ReplyBuffer,

/* указатель на буфер для приема пакета-отклика */
DWORD ReplySize, /* размер буфера для пакета-отклика */
DWORD Timeout /* время ожидания отклика в миллисекундах */
);
struct icmp_echo_reply { /* Структура ICMP-отклика */
u_long Address; /* адрес отправителя */
u_long Status; /* код IP-статуса */
u_long RTTime; /* RTT в миллисекундах */
u_short DataSize; /* длина пакета-отклика */
u_short Reserved; /* зарезервировано на будущее */
void FAR *Data; /* буфер отклика */
struct ip_option_information Options; /* опции отклика */
}; ICMPECHO, *PICMPECHO, FAR *LPICMPECHO;
struct ip_option_information { /* Структура опций протокола ICMP */
u_char TTL; /* Time To Live (используется процедурой traceroute) */
u_char Tos; /* Type Of Service (тип сервиса; обычно 0) */
u_char Flags; /* Флаги IP-заголовка (обычно 0) */
u_char OptionsSize; /* Размер буфера опций (обычно 0, max=40) */
u_char FAR *OptionsData; /* Буфер опций */
} IPINFO, *PIPINFO, FAR *LPIPINFO;

Приложение может использовать WSAEnumProtocols для определения того, какой транспортный протокол (стек протоколов) поддерживается, и попутно можно получить дополнительную информацию, которая содержится в структуре WSAPROTOCOL_INFO.

В то время как в WinSock 1.1 имеется только одно семейство адресов AF_INET, включающее в себя ограниченное число известных типов соединителей и идентификаторов протоколов, в WinSock 2 это ограничение снято. Информация по WinSock 2 доступна по адресу:

www.stardust.com/winsock/ws_specs.htm

В настоящее время WinSock допускает совмещение по времени нескольких операций ввода/вывода.


Такого рода операции возможны только для соединителей, созданных оператором WSASocket с флагом WSA_FLAG_OVERLAPPED=1 (Win32).

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

Допуская возможность нескольких операций ввода/вывода одновременно, нужно обеспечить соответствие между этими процессами и сообщениями об их завершении. В Winsock эта проблема решена с помощью введения объектов события (event objects), по аналогии с Win32. Эти объекты создаются, уничтожаются, устанавливаются в определенное состояние и т.д. Приложение может использовать оператор WSACreateEvent для создания дескриптора (указателя) объекта события, который передается в качестве обязательного параметра для совмещаемых во времени процедур посылки и получения данных (WSASend, WSASendTo, WSARecv, WSARecvFrom). Каждому оператору создания объекта WSACreateEvent должен соответствовать оператор WSACloseEvent, ликвидирующий его. Объекты события используются также оператором WSAEventSelect для того, чтобы связать FD_XXX сетевое события с объектами события.

В 32-разрядной среде операторы для работы с объектами события WSACreateEvent, WSACloseEvent, WSAResetEvent, WSASetEvent, WSAGetOverlappedResult и WSAWaitForMultipleEvents строго соответствуют операторам Win32.

Приложение может установить режим ожидания с блокировкой для одного или нескольких объектов события, используя оператор WSAWaitForMultipleEvents. Для этих целей можно применить и WaitForMultipleObjects. Если при ожидании предпочтительнее отсутствие блокировки, можно воспользоваться оператором WSAGetOverlappedResult, чтобы проконтролировать завершение заданного процесса.

Операторы запуска совмещаемых по времени процессов ввода/вывода WSASend, WSASendTo, WSARecv, WSARecvFrom используют в качестве опционного указателя lpCompletionRoutine, который позволяет по завершении процесса обмена передать управление определенной приложением программе.



В версии WinSock 2 введено понятие группы соединителей, которое позволяет приложению сообщить сервис провайдеру, что данный набор соединителей имеет определенные идентичные свойства (атрибуты). К числу этих свойств относятся относительные приоритеты отдельных соединителей в пределах группы, а также спецификация качества услуг (QOS).

Приложения, реализующие мультимедийные потоки данных, нуждаются в организации специфических взаимоотношений между наборами соединителей. Как минимум это может включать подсказку сервис провайдеру о приоритетности потоков информации. Например, при проведении видеоконференций звуковое сопровождение должно иметь более высокий приоритет, чем видеоинформация. Кроме того, существуют сервис провайдеры, которые могут обеспечить запрашиваемое качество обслуживание (код QOS).



WSASocket
и WSAAccept представляют собой два новых оператора, используемых для создания соединителей и групп, а также для включения соединителя в определенную группу. Идентификатор группы соединителя можно узнать с помощью оператора getsockopt с опцией SO_GROUP_ID. Установка и проверка относительного приоритета соединителей в группе осуществляется соответственно операторами getsockopt и setsockopt с опцией SO_GROUP_PRIORITY. Опции соединителей приведены в таблице 7.8.


Содержание раздела