Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для получения показаний завершения доступны несколько вариантов, что обеспечивает приложения с соответствующим уровнем гибкости. К ним относятся ожидание (или блокировка) объектов событий, опрос объектов событий и подпрограммы завершения ввода-вывода сокетов.
Блокировка и ожидание сигнала завершения
Приложения могут блокироваться при ожидании установки одного или нескольких объектов событий с помощью функции WSAWaitForMultipleEvents. В реализациях Windows процесс или поток действительно блокируются. Так как объекты событий Windows Sockets 2 реализованы как события Windows, встроенная функция Windows, WaitForMultipleObjects также можно использовать для этой цели. Это особенно полезно, если потоку нужно ждать событий как сокета, так и не связанных с сокетом.
Опрос для индикатора завершения
Приложения, которые предпочитают не блокировать, могут использовать функцию WSAGetOverlappedResult для опроса состояния завершения, связанного с любым определённым объектом события. Эта функция указывает, завершена ли перекрываемая операция и если она завершена, упорядочивает функцию WSAGetLastError, чтобы получить состояние ошибки перекрываемой операции.
Использование процедур завершения ввода-вывода для сетевых сокетов
Функции, используемые для запуска перекрывающихся операций ввода-вывода (WSASend, WSASendTo, WSARecv, WSARecvFrom), каждая из которых может принимать lpCompletionRoutine в качестве дополнительного входного параметра. Это указатель на функцию, связанную с приложением, которая вызывается после успешно инициированной операции ввода-вывода (успешно или в противном случае). Подпрограмма завершения подчиняется тем же правилам, что и подпрограммы завершения операций ввода-вывода файлов в Windows. То есть подпрограмма завершения не вызывается, пока поток не находится в состоянии ожидания, допускающем прерывание, например, когда функция WSAWaitForMultipleEvents вызывается с установленным флагом fAlertable
. Приложение, использующее параметр подпрограммы завершения для определенного перекрывающегося запроса ввода-вывода, может не использовать параметр ожидания WSAGetOverlappedResult для того же перекрывающегося запроса ввода-вывода.
Транспорты позволяют приложению вызывать операции отправки и получения из контекста подпрограммы завершения ввода-вывода сокета и гарантировать, что для заданного сокета подпрограммы завершения ввода-вывода не будут вложены. Это позволяет передавать чувствительные ко времени данные полностью в прерываемом контексте.
Сводка по механизмам указания перекрываемого завершения
Конкретное указание завершения ввода-вывода для данной перекрывающейся операции определяется тем, предоставляет ли приложение указатель на функцию завершения, ссылается ли на структуру WSAOVERLAPPED, а также значением элемента hEvent в структуре WSAOVERLAPPED (если указано). В следующей таблице приведена семантика завершения для перекрываемого сокета и показаны различные сочетания lpOverlapped, hEventи lpCompletionRoutine:
lpOverlapped | hEvent | lpCompletionRoutine | Подтверждение завершения |
---|---|---|---|
НЕДЕЙСТВИТЕЛЬНЫЙ | Неприменимо | Проигнорировано | Операция выполняется синхронно. Он ведет себя так, как если бы он был неперекрытым сокетом. |
! НЕДЕЙСТВИТЕЛЬНЫЙ | НЕДЕЙСТВИТЕЛЬНЫЙ | НЕДЕЙСТВИТЕЛЬНЫЙ | Операция завершается асинхронно, но механизм завершения, поддерживаемый Windows Sockets 2, отсутствует. В этом случае можно использовать механизм порта завершения (если он поддерживается). В противном случае уведомление о завершении отсутствует. |
! НЕДЕЙСТВИТЕЛЬНЫЙ | ! НЕДЕЙСТВИТЕЛЬНЫЙ | NULL | Операция завершается асинхронно с уведомлением посредством сигнального объекта события. |
! НЕДЕЙСТВИТЕЛЬНЫЙ | Проигнорировано | ! НЕДЕЙСТВИТЕЛЬНЫЙ | Операция завершается в режиме наложения, уведомление посредством планирования завершения процедуры. |