Поделиться через


Получение индикаций завершения

Для получения показаний завершения доступны несколько вариантов, что обеспечивает приложения с соответствующим уровнем гибкости. К ним относятся ожидание (или блокировка) объектов событий, опрос объектов событий и подпрограммы завершения ввода-вывода сокетов.

Блокировка и ожидание сигнала завершения

Приложения могут блокироваться при ожидании установки одного или нескольких объектов событий с помощью функции 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 Операция завершается асинхронно с уведомлением посредством сигнального объекта события.
! НЕДЕЙСТВИТЕЛЬНЫЙ Проигнорировано ! НЕДЕЙСТВИТЕЛЬНЫЙ Операция завершается в режиме наложения, уведомление посредством планирования завершения процедуры.