WPUCompleteOverlappedRequest 函数 (ws2spi.h)

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

Syntax

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 中提供了特定的错误代码。

错误代码 Meaning
WSAEINVAL
传入 s 参数的套接字不是 WPUCreateSocketHandle 创建的套接字。

注解

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

**注意** 此函数与其他具有“WPU”前缀的函数不同,因为它不能通过 lambdaall 表进行访问。 而是直接通过 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 成员设置为传输的字节数。 然后,它将 内部 成员设置为非特殊值WSS_OPERATION_IN_PROGRESS的某些依赖于 OS 的值。 WPUCompleteOverlappedRequest 返回这些值之前可能会有一些轻微的延迟,因为处理可能会异步发生。 但是,在设置 InternalHigh 值(字节计数)时,可以保证设置 InternalHigh 值。

WPUCompleteOverlappedRequest 按状态工作(按客户端请求执行完成通知),无论套接字句柄是否与完成端口相关联。

与 WSPGetOverlappedResult 交互

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

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

要求

Requirement 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows操作系统
Header ws2spi.h
Library mincore.lib

另请参阅

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPPED

WSPGetOverlappedResult