WPUCompleteOverlappedRequest 函数 (ws2spi.h)

WPUCompleteOverlappedRequest 函数对重叠的 I/O 操作执行重叠的 I/O 完成通知。

语法

int WPUCompleteOverlappedRequest(
  [in]  SOCKET          s,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  DWORD           dwError,
  [in]  DWORD           cbTransferred,
  [out] LPINT           lpErrno
);

参数

[in] s

由 WPUCreateSocketHandle 创建的服务提供程序套接字。

[in] lpOverlapped

指向与要通知其完成的重叠 I/O 操作关联的 WSAOVERLAPPED 结构的指针。

[in] dwError

要通知其完成的重叠 I/O 操作的完成状态。

[in] cbTransferred

传输方向 (客户端缓冲区传输的字节数取决于重叠 I/O 操作的发送或接收性质,该操作的完成将在) 通知。

[out] lpErrno

指向执行此函数导致的错误代码的指针。

返回值

如果未发生错误,WPUCompleteOverlappedRequest 将返回零,并根据客户端选择的机制通知重叠 I/O 操作完成, (向 lpOverlapped 引用的 WSAOVERLAPPED 结构中找到的事件发出信号,并且/或将完成状态报告排队到与套接字关联的完成端口(如果完成端口关联) )。 否则, WPUCompleteOverlappedRequest 将返回SOCKET_ERROR,并且 lpErrno 中提供了特定的错误代码。

错误代码 含义
WSAEINVAL
s 参数中传递的套接字不是 由 WPUCreateSocketHandle 创建的套接字。

注解

WPUCompleteOverlappedRequest 函数对重叠的 I/O 操作执行重叠 I/O 完成通知,其中客户端指定的完成机制不是用户模式异步过程调用 (APC) 。 此函数只能用于 WPUCreateSocketHandle 创建的套接字句柄。

**注意** 此函数不同于具有“WPU”前缀的其他函数,因为它不能通过“wpuall”表进行访问。 而是由 Ws2_32.dll 直接导出。 需要调用此函数的服务提供商应链接到 WS2_32.lib 或使用适当的操作系统函数(如 LoadLibraryGetProcAddress )来检索函数指针。
 
函数 **WPUCompleteOverlappedRequest** 由不直接为其公开的套接字句柄实现可安装文件系统 (IFS) 功能的服务提供商使用。 它针对指定完成通知不是用户模式 APC 的任何重叠 I/O 请求执行完成通知。 **WPUCompleteOverlappedRequest** 仅支持 WPUCreateSocketHandle 创建的套接字句柄,而不支持由服务提供商直接创建的套接字。

如果客户端选择用户模式 APC 作为通知方法,则服务提供商应使用 WPUQueueApc 或其他适当的操作系统函数来执行完成通知。 如果客户端未选择用户模式 APC,则不直接实现 IFS 功能的服务提供商无法确定客户端是否将完成端口与套接字句柄相关联。 因此,它无法确定完成通知方法是应将完成状态记录排队到完成端口,还是向 在 WSAOVERLAPPED 结构中找到的事件发出信号。 Windows 套接字 2 体系结构跟踪与 WPUCreateSocketHandle 创建的套接字的任何完成端口关联,并且可以在基于完成端口的通知或基于事件的通知之间做出正确的决策。

WPUCompleteOverlappedRequest 将完成指示排队时,它将 WSAOVERLAPPED 结构的 InternalHigh 成员设置为传输的字节计数。 然后,它将 内部 成员设置为某些依赖于 OS 的值,而不是WSS_OPERATION_IN_PROGRESS特殊值。 WPUCompleteOverlappedRequest 返回这些值之前,可能会有一些轻微的延迟,因为处理可能会异步进行。 但是,保证在设置 Internal 时设置InternalHigh 值 (字节计数) 。

WPUCompleteOverlappedRequest 按所述方式工作, (执行客户端请求的完成通知,) 套接字句柄是否与完成端口相关联。

与 WSPGetOverlappedResult 交互

WPUCompleteOverlappedRequest 的行为对服务提供商实现 WSPGetOverlappedResult 的方式存在一些限制,因为只有 WSAOVERLAPPED 结构的 OffsetOffsetHigh 成员由服务提供商独占控制,但 WSPGetOverlappedResult 必须从结构中检索三个值 (字节计数、标志和错误) 。 只要服务提供商正确与 WPUCompleteOverlappedRequest 的行为交互,它可以选择的任何方式来实现此目的。 但是,典型的实现如下所示:

  • 在重叠处理开始时,服务提供商将 Internal 设置为 WSS_OPERATION_IN_PROGRESS。
  • 完成 I/O 操作后,提供程序会将 OffsetHigh 设置为操作产生的 Windows 套接字 2 错误代码,将 Offset 设置为 I/O 操作生成的标志,并调用 WPUCompleteOverlappedRequest,将传输字节计数作为参数之一传递。 WPUCompleteOverlappedRequest 最终将 InternalHigh 设置为传输字节计数,然后将 Internal 设置为 WSS_OPERATION_IN_PROGRESS 以外的值。
  • 调用 WSPGetOverlappedResult 时,服务提供商会检查 “内部”。 如果WSS_OPERATION_IN_PROGRESS,则提供程序将等待 hEvent 成员中的事件句柄,或者根据 WSPGetOverlappedResult 的 FWAIT 标志的设置返回错误。 如果未进行或等待完成后,提供程序将分别返回 InternalHighOffsetHighOffset 中的值作为传输计数、操作结果错误代码和标志。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 ws2spi.h

另请参阅

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPPED

WSPGetOverlappedResult