Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
13.02.2015
Размер:
25 Кб
Скачать

Информация о протоколе

int WSAEnumProtocols(  _In_		LPINT lpiProtocols,  _Out_	LPWSAPROTOCOL_INFO lpProtocolBuffer,  _Inout_	LPDWORD lpdwBufferLength);

Если lpiProtocols== NULL , то выводится информация о всех протоколах

В системе может быть установлено несколько провайдеров для одного протокола.Из-за этого количество использованных элементов в массиве lpProtocolBuffer может превышать количество протоколов, определяемых параметром lpiProtocols.

WSAPROTOCOL_INFO — содержит всю информацию о протоколе

WSASocketSOCKET WSASocket(  _In_		int af,  _In_		int type,  _In_		int protocol,  _In_		LPWSAPROTOCOL_INFO lpProtocolInfo,  _In_		GROUP g,  _In_		DWORD dwFlags);

Если указатель lpProtocolInfo равен NULL, функция создаёт сокет на основании первых трёх параметров так же, как это делает функция Socket.

Иначе: первые три параметра должны быть равны константе From_Protocol_Info (-1).

Вызов функции Socket эквивалентен вызову функции WSASocket с флагом WSA_Flag_Overlapped, который показывает, что данный сокет можно использовать для перекрытого ввода-вывода

WSAConnect

int WSAConnect(  _In_		SOCKET s,  _In_		const struct sockaddr *name,  _In_		int namelen,  _In_		LPWSABUF lpCallerData,  _Out_		LPWSABUF lpCalleeData,  _In_		LPQOS lpSQOS,  _In_		LPQOS lpGQOS);

Протоколы стека TCP/IP не поддерживают передачу данных при соединении, поэтому при использовании TCP и UDP lpCallerData и lpCalleeData должны быть равны NULL.

Первые ТРИ параметра == как в функции Connect

WSAAcceptSOCKET WSAAccept(  _In_		SOCKET s,  _Out_		struct sockaddr *addr,  _Inout_	LPINT addrlen,  _In_		LPCONDITIONPROC lpfnCondition,  _In_		DWORD_PTR dwCallbackData);

Для фильтра подключающихся клиентов приходилось разрывать соединение после подключения

lpfnCondition является указателем на функцию обратного вызова. Эта функция объявляется и реализуется программой. WSAAccept вызывает её внутри себя и в зависимости от её результата принимает или отклоняет соединение.

Функция должна вернуть CF_Accept (0), если соединение принимается, CF_Reject (1), если оно отклоняется, и CF_Defer (2), если решение о разрешении или запрете соединения откладывается.

Асинхронный режим, основанный на сообщениях

Асинхронный режим с уведомлением через сообщения устанавливается функцией WSAAsyncSelect:

intWSAAsyncSelect(  _In_		SOCKET s,  _In_		HWND hWnd,  _In_		unsigned int wMsg,  _In_		long lEvent);

S определяет сокет, для которого устанавливается асинхронный режим

работы.

hWnd- дескриптор окна, которому будут приходить сообщения,

wMsg — сообщение

lEvent задаёт события, которые вызывают отправку сообщения.

Например:

FD_Read Сокет готов к чтению

FD_Accept в очереди сокета есть подключения (применимо только для сокетов, находящихся в режиме ожидания подключения)

Каждый последующий вызов WSAAsyncSelect для одного и того же сокета отменяет предыдущий вызов.

Функция WSAAsyncSelect переводит сокет в неблокирующий режим

При получении сообщения его параметр wParam содержит дескриптор сокета, на котором произошло событие. Младшее слово lParam содержит произошедшее событие (одну из констант FD_XXX), а старшее слово - код ошибки.

Как только соответствующее сообщение помещается в очередь окна, дальнейшая генерация таких сообщений для этого сокета блокируется

Если после вызова Recv в буфере асинхронного сокета остались данные, в очередь окна снова помещается это же сообщение

Возможны ложные срабатывания

Соседние файлы в папке Программирование_распределенных_систем