Асинхронные операторы
Таблица 7.5. Асинхронные операторы
WSAAccept* |
Расширенная версия accept, которая позволяет условное подключение и формирование групп соединителей. |
WSACloseEvent |
Уничтожает объект события. |
WSAConnect* |
Расширенная версия connect, которая позволяет обмениваться данными о соединении и QoS-информацией. |
WSACreateEvent |
Создает объект события. |
WSADuplicateSocket |
Создает новый дескриптор соединителя для случая использования его несколькими процессами. |
WSAEnumNetworkEvents |
Выявляет сетевые события. |
WSAEnumProtocols |
Выдает информацию о каждом доступном протоколе. |
WSAEventSelect |
Связывает сетевое событие с объектом события. |
WSAGetOverlappedResult |
Сообщает состояние выполнения совместной операции обмена. |
WSAGetQOSByName |
Выдает параметры qos для заданного имени сетевой услуги. |
WSAHtonl |
Расширенная версия htonl |
WSAHtons |
Расширенная версия htons |
WSAIoctl* |
Версия ioctlsocket, пригодная для совмещения процедур ввода/вывода |
WSAJoinLeaf* |
Подключает периферийный узел к многоточечной сессии. |
WSANtohl |
Расширенная версия ntohl |
WSANtohs |
Расширенная версия ntohs |
WSARecv* |
Расширенная версия recv, которая позволяет совмещать по времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей и получать флаги в качестве входных и выходных параметров. |
WSARecvDisconnect |
Завершает работу соединителя и выдает информацию о завершении, если соединитель был ориентирован на работу в связанном состоянии. |
WSARecvFrom* |
Расширенная версия recvfrom, которая позволяет совмещать по времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей и получать флаги в качестве входных и выходных параметров |
WSAResetEvent |
Обнуляет объект события. |
WSASend* |
Расширенная версия send, которая позволяет совмещать по времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей. |
WSASendDisconnect |
Инициализирует процедуру закрытия соединения и опционно посылает сообщение disconnect. |
WSASendTo* |
Расширенная версия sendto, которая позволяет совмещать по времени операции ввода/вывода, использовать многобуферную схему при работе с векторами указателей. |
WSASetEvent |
Устанавливает объект события. |
WSASocket |
Расширенная версия socket, которая использует структуру WSAPROTOCOL_INFO в качестве входной информации и позволяет создать соединители, работающие одновременно. Позволяет также формировать группы соединителей. |
WSAWaitForMultipleEvents |
Присылается, если любой или все специфицированные объекты находятся в сигнальном состоянии или когда истекает время таймаута. |
<
* Программа может вызвать блокировку при работе с блокирующим соединителем.
При написании программ на персональной ЭВМ, например, на С++ или ассемблере существует возможность выбора модели памяти: small, medium, compact, large или huge. Эти модели отличаются друг от друга числом сегментов (по 64 Кбайт) памяти, выделяемой для программы и данных. Модель small предполагает, что все указатели имеют тип near, если явно не указано обратное (не записан модификатор FAR). Модель large считает по умолчанию все указатели дальними, если явно не присутствует модификатор near. В модели huge длина блока данных может превышать размер одного сегмента. С особенностями этих моделей рекомендуется ознакомиться по описаниям конкретных трансляторов. Используя те или иные модели при создании сетевых программ, нужно учитывать проблемы, которые могут возникнуть при переносе вашей программы из одной операционной среды в другую. ОС Unix, Windows NT и Windows 97 не поддерживают каких-либо моделей памяти и их система адресации скорее совместима с моделью large. Но при переносе программы из одной среды в другую об этой проблеме лучше не забывать и перед началом отладки полезно изучить особенности адресации.
При программировании под Windows 3.1 нужно учитывать то, что для доступа к процессору (ЦПУ) необходимо, чтобы программа, захватившая его раньше, прекратила свою работу и освободила ЦПУ. Этого не требуется в среде Unix, Windows 95 или Windows NT. Различие этих операционных сред особенно заметно при выполнении блокирующих процедур, рассмотренных выше, например операции сетевого ввода/вывода. Блокирующие процедуры являются потенциальным источником “повисания” программ, например, оператор recv может вечно ждать отклика, в то время как удаленный сервер будет ждать сообщения от программы, выполняющей recv. По этой причине создание не блокирующих соединителей представляется привлекательным. Такие соединители формируются путем вызова стандартного оператора socket с последующим обращением к процедуре, изменяющей режим работы соединителя (по умолчанию создается блокирующий соединитель).
После этого при вызове блокирующего оператора, например, recv при условии, что соединитель не имеет запрашиваемых данных, система возвратит флаг ошибки. Таким образом, при работе с неблокирующим соединителем, операционная система проверяет возможность немедленного выполнения процедуры, и возвращает сигнал ошибки, если это не возможно. Все операторы winsock являются асинхронными и неблокирующими. Асинхронные операции при невозможности выполнить требуемую операцию не выдают сообщения об ошибке, за тем, чтобы процедура была выполнена так как нужно, в этом случае следит операционная система. По завершении асинхронной операции ОС Windows посылает сообщение тому окну, из которого эта операция была вызвана. Но и операторы, работающие с неблокирующими соединителями Беркли, также являются неблокирующими. В то же время все операции ввода и вывода в Unix являются синхронными.
Хотя оператор WSAAsyncSelect считается аналогом select, между ними имеется существенное отличие. WSAAsyncSelect - единственный оператор, использующий дескриптор соединителя в качестве параметра. Если select контролирует состояние нескольких соединителей, для того чтобы достичь того же результата с помощью wsaasyncselect надо реализовать столько вызовов, сколько соединителей мы хотим мониторировать. Форма обращения к WSAAsyncSelect имеет вид:
WSAAsyncSelect(SOCKETs, HWND hWnd, unsigned int wMsg, long lEvent),
где s - дескриптор соединителя, состояние которого мы хотим контролировать, аргумент, hWnd - дескриптор окна-получателя сообщения; wMsg - определяет тип посылаемого сообщения (эти два параметра являются стандартными для всех функций Windows); lEvent - битовая маска, определяющая тип событий, которые нас интересуют. Возможные значения параметра lEvent приведены в таблице 7.6.
Содержание раздела