Указатель на структуру типа для команды 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.
Содержание раздела