Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция WPUCompleteOverlappedRequest выполняет перекрываемое уведомление о завершении ввода-вывода для перекрывающихся операций ввода-вывода.
Синтаксис
int WPUCompleteOverlappedRequest(
[in] SOCKET s,
[in] LPWSAOVERLAPPED lpOverlapped,
[in] DWORD dwError,
[in] DWORD cbTransferred,
[out] LPINT lpErrno
);
Параметры
[in] s
Сокет поставщика услуг, созданный WPUCreateSocketHandle.
[in] lpOverlapped
Указатель на структуру WSAOVERLAPPED , связанную с перекрывающейся операцией ввода-вывода, завершение которой должно быть уведомлено.
[in] dwError
Состояние завершения перекрываемой операции ввода-вывода, завершение которой должно быть уведомлено.
[in] cbTransferred
Количество байтов, передаваемых в буферы клиента или из него (направление передачи зависит от характера отправки или получения перекрываемой операции ввода-вывода, завершение которой должно быть уведомлено).
[out] lpErrno
Указатель на код ошибки, полученный из-за выполнения этой функции.
Возвращаемое значение
Если ошибка не возникает, WPUCompleteOverlappedRequest возвращает ноль и уведомляет о завершении перекрывающейся операции ввода-вывода в соответствии с механизмом, выбранным клиентом (сигнализирует о событии, обнаруженном в структуре WSAOVERLAPPED , на которую ссылается lpOverlapped , и /или очереди отчета о состоянии завершения в порт завершения, связанный с сокетом, если порт завершения связан). В противном случае WPUCompleteOverlappedRequest возвращает SOCKET_ERROR, а определенный код ошибки доступен в lpErrno.
| Код ошибки | Meaning |
|---|---|
| Сокет, переданный в параметре s , не является сокетом, созданным WPUCreateSocketHandle. |
Замечания
Функция WPUCompleteOverlappedRequest выполняет перекрываемое уведомление о завершении ввода-вывода для перекрывающихся операций ввода-вывода, в которых механизм завершения, указанный клиентом, является чем-то, кроме вызова асинхронной процедуры в режиме пользователя (APC). Эту функцию можно использовать только для дескрипторов сокетов, созданных WPUCreateSocketHandle.
Если клиент выбирает APC в пользовательском режиме в качестве метода уведомлений, поставщик услуг должен использовать WPUQueueApc или другую соответствующую функцию операционной системы для выполнения уведомления о завершении. Если APC в пользовательском режиме не выбран клиентом, поставщик услуг, не реализующий функции IFS, напрямую не может определить, связан ли клиент с дескриптором сокета порт завершения. Таким образом, он не может определить, должен ли метод уведомления о завершении очередью записи состояния завершения в порт завершения или сигнализировать о событии, обнаруженном в структуре WSAOVERLAPPED . Архитектура Сокета Windows 2 отслеживает связь любого порта завершения с сокетом, созданным WPUCreateSocketHandle , и может принимать правильное решение между уведомлением на основе порта завершения или уведомлением на основе событий.
Если WPUCompleteOverlappedRequest помещает в очередь признак завершения, он задает элемент InternalHigh структуры WSAOVERLAPPED в число передаваемых байтов. Затем он задает внутренний элемент для некоторых зависимых от ОС значений, отличных от специального значения WSS_OPERATION_IN_PROGRESS. Может возникнуть небольшая задержка после возврата WPUCompleteOverlappedRequest до появления этих значений, так как обработка может происходить асинхронно. Тем не менее, значение InternalHigh (число байтов) гарантированно задается по времени, когда задан внутренний .
WPUCompleteOverlappedRequest работает как указано (выполняет уведомление о завершении, запрошенное клиентом), независимо от того, связан ли дескриптор сокета с портом завершения.
Взаимодействие с WSPGetOverlappedResult
Поведение WPUCompleteOverlappedRequest устанавливает некоторые ограничения на то, как поставщик услуг реализует WSPGetOverlappedResult , так как только члены Offset иOffsetHigh структуры WSAOVERLAPPED управляются исключительно поставщиком услуг, но три значения (число байтов, флаги и ошибка) должны быть извлечены из структуры WSPGetOverlappedResult. Поставщик услуг может сделать это так, как он выбирает, если он взаимодействует с поведением WPUCompleteOverlappedRequest должным образом. Однако типичная реализация выглядит следующим образом:
- В начале перекрывающейся обработки поставщик услуг устанавливает внутреннее значение WSS_OPERATION_IN_PROGRESS.
- Когда операция ввода-вывода завершена, поставщик устанавливает OffsetHigh в код ошибки Сокета Windows 2, полученный из операции , задает флаги Offset, полученные из операции ввода-вывода, и вызывает WPUCompleteOverlappedRequest, передав число байтов передачи в качестве одного из параметров. WPUCompleteOverlappedRequest в конечном итоге задает внутреннее число байтов передачи, а затем задает внутреннее значение, отличное от WSS_OPERATION_IN_PROGRESS.
- При вызове WSPGetOverlappedResult поставщик услуг проверяет внутренний. Если это WSS_OPERATION_IN_PROGRESS, поставщик ожидает дескриптора событий в элементе hEvent или возвращает ошибку на основе параметра флага FWAIT WSPGetOverlappedResult. Если он не выполняется или после завершения ожидания, поставщик возвращает значения из InternalHigh, OffsetHigh и Offset в качестве счетчика передачи, кода ошибки результата операции и флагов соответственно.
Требования
| Требование | Ценность |
|---|---|
| Минимальный поддерживаемый клиент | Windows 2000 Профессиональный [только классические приложения] |
| минимальный поддерживаемый сервер | Windows 2000 Server [только классические приложения] |
| целевая платформа | Виндоус |
| Header | ws2spi.h |
| Library | WS2_32.Lib |