WSAGetOverlappedResult 函数 (winsock2.h)

WSAGetOverlappedResult 函数检索指定套接字上重叠操作的结果。

语法

BOOL WSAAPI WSAGetOverlappedResult(
  [in]  SOCKET          s,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [out] LPDWORD         lpcbTransfer,
  [in]  BOOL            fWait,
  [out] LPDWORD         lpdwFlags
);

参数

[in] s

标识套接字的描述符。

这是通过调用支持重叠操作的任何 Winsock 函数启动重叠操作时指定的同一套接字。 这些函数包括 AcceptExConnectExDisconnectExTransmitFileTransmitPacketsWSARecvWSARecvFrom、LPFN_WSARECVMSG (WSARecvMsg) WSASendWSASendMsgWSASendToWSAIoctl

[in] lpOverlapped

指向在启动重叠操作时指定的 WSAOVERLAPPED 结构的指针。 此参数不得为 NULL 指针。

[out] lpcbTransfer

指向 32 位变量的指针,该变量接收发送或接收操作或 WSAIoctl 函数实际传输的字节数。 此参数不得为 NULL 指针。

[in] fWait

一个标志,指定函数是否应等待挂起的重叠操作完成。 如果 为 TRUE,则函数在操作完成之前不会返回。 如果为 FALSE 且操作仍处于挂起状态,则函数返回 FALSE,WSAGetLastError 函数返回WSA_IO_INCOMPLETE。 仅当重叠操作选择了基于事件的完成通知时, fWait 参数才能设置为 TRUE

[out] lpdwFlags

指向 32 位变量的指针,该变量将接收一个或多个补充完成状态的标志。 如果重叠操作是通过 WSARecvWSARecvFrom 启动的,则此参数将包含 lpFlags 参数的结果值。 此参数不得为 NULL 指针。

返回值

如果 WSAGetOverlappedResult 成功,则返回值为 TRUE。 这意味着重叠操作已成功完成,并且 已更新 l快速入门所 指向的值。

如果 WSAGetOverlappedResult 返回 FALSE,这意味着重叠操作尚未完成,重叠操作已完成但出现错误,或者由于 WSAGetOverlappedResult 的一个或多个参数中的错误而无法确定重叠操作的完成状态。 失败时, 不会更新 lTransfer 指向的值。 使用 WSAGetLastError 确定失败原因 (WSAGetOverlappedResult 函数或关联的重叠操作) 。

错误代码 含义
WSANOTINITIALISED
在使用此函数之前,必须成功调用 WSAStartup
WSAENETDOWN
网络子系统失败。
WSAENOTSOCK
:描述符不是套接字。
WSA_INVALID_HANDLE
WSAOVERLAPPED 结构的 hEvent 参数不包含有效的事件对象句柄。
WSA_INVALID_PARAMETER
其中一个参数是不能接受的。
WSA_IO_INCOMPLETE
fWait 参数为 FALSE,I/O 操作尚未完成。
WSAEFAULT
一个或多个 lpOverlappedl的身份转换lpdwFlags 参数不在用户地址空间的有效部分。 如果在 Windows Server 2003 及更早版本上 ,lpOverlappedl弹出窗口TransferlpdwFlags 参数是 NULL 指针,则返回此错误。

注解

WSAGetOverlappedResult 函数报告 s 参数中指定的套接字的 lpOverlapped 参数中指定的重叠操作的结果。 WSAGetOverlappedResult 函数将传递在调用重叠函数时指定的套接字描述符和 WSAOVERLAPPED 结构。 当启动操作的函数返回 FALSEWSAGetLastError 函数返回 WSA_IO_PENDING时,指示挂起的操作。 当 I/O 操作(如 WSARecv)处于挂起状态时,启动该操作的函数会将 WSAOVERLAPPED 结构的 hEvent 成员重置为未签名状态。 然后,当挂起的操作完成时,系统将事件对象设置为信号状态。

如果 fWait 参数为 TRUE则 WSAGetOverlappedResult 将通过等待事件对象处于信号状态来确定挂起的操作是否已完成。 客户端可将 fWait 参数设置为 TRUE,但前提是在请求 I/O 操作时选择了基于事件的完成通知。 如果选择了另一种通知形式,则 WSAOVERLAPPED 结构的 hEvent 参数的用法会有所不同,并且将 fWait 设置为 TRUE 会导致不可预知的结果。

如果调用 WSAGetOverlappedResult 函数时,将 lpOverlappedlxmlTransferlpdwFlags 参数设置为 Windows Vista 上的 NULL 指针,这将导致访问冲突。 如果在 Windows Server 2003 及更早版本上将 lpOverlappedl或者lpdwFlags 参数设置为 NULL 指针的情况下调用 WSAGetOverlappedResult 函数,则会导致返回 WSAEFAULT 错误代码。

注意 当线程退出时,将取消所有 I/O。 对于重叠的套接字,如果在操作完成之前关闭线程,挂起的异步操作可能会失败。 有关详细信息 ,请参阅 ExitThread
 
Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

要求

要求
最低受支持的客户端 Windows 8.1、Windows Vista [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 winsock2.h
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅

WSAAccept

WSAConnect

WSACreateEvent

WSAIoctl

WSARecv

WSARecvFrom

WSASend

WSASendTo

WSAWaitForMultipleEvents

Winsock 函数

Winsock 参考