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


Функция WPUCompleteOverlappedRequest (ws2spi.h)

Функция 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
WSAEINVAL
Сокет, переданный в параметре s , не является сокетом, созданным WPUCreateSocketHandle.

Замечания

Функция WPUCompleteOverlappedRequest выполняет перекрываемое уведомление о завершении ввода-вывода для перекрывающихся операций ввода-вывода, в которых механизм завершения, указанный клиентом, является чем-то, кроме вызова асинхронной процедуры в режиме пользователя (APC). Эту функцию можно использовать только для дескрипторов сокетов, созданных WPUCreateSocketHandle.

**Примечание** Эта функция отличается от других функций с префиксом WPU в том, что он недоступен через таблицу с пакетной таблицей. Вместо этого он экспортируется непосредственно Ws2_32.dll. Поставщики служб, которые должны вызывать эту функцию, должны связываться с WS2_32.lib или использовать соответствующие функции операционной системы, такие как LoadLibrary и GetProcAddress для получения указателя функции.
 
Функция **WPUCompleteOverlappedRequest** используется поставщиками служб, которые не реализуют функциональные возможности устанавливаемой файловой системы (IFS) непосредственно для дескрипторов сокета, которые они предоставляют. Он выполняет уведомление о завершении для любого перекрывающегося запроса ввода-вывода, для которого указанное уведомление о завершении отличается от APC в пользовательском режиме. **WPUCompleteOverlappedRequest** поддерживается только для дескрипторов сокетов, созданных 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

См. также

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPPED

WSPGetOverlappedResult