WSARecvEx 函数 (winsock.h)

WSARecvEx 函数从连接的套接字或绑定的无连接套接字接收数据。 WSARecvEx 函数类似于 recv 函数,只不过 flags 参数仅用于返回信息。 在使用数据报协议时收到部分消息时,将在函数返回时在 flags 参数中设置MSG_PARTIAL位。

注意WSARecvEx 函数是 Windows 套接字规范的特定于 Microsoft 的扩展。
 

语法

int WSARecvEx(
  [in]      SOCKET s,
  [out]     char   *buf,
  [in]      int    len,
  [in, out] int    *flags
);

参数

[in] s

标识连接的套接字的描述符。

[out] buf

指向用于接收传入数据的缓冲区的指针。

[in] len

buf 参数指向的缓冲区的长度(以字节为单位)。

[in, out] flags

一个指示器,指定数据报套接字是完全接收还是部分接收消息。

返回值

如果未发生错误, WSARecvEx 将返回收到的字节数。 如果连接已关闭,则返回零。 此外,如果收到部分消息,则会在 flags 参数中设置MSG_PARTIAL位。 如果收到完整的消息,则未在标志中设置MSG_PARTIAL

否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

重要 对于面向流的传输协议,从 WSARecvEx 返回时永远不会设置MSG_PARTIAL。 此函数的行为与流传输协议的 recv 函数相同。
 
错误代码 含义
WSAECONNABORTED
由于超时或其他故障,虚拟线路已终止。 因为套接字不可再用,应用程序应关闭套接字。
WSAECONNRESET
执行硬性或异常关闭的远程端重置了虚拟线路。 因为套接字不可再用,应用程序应关闭套接字。 在 UPD 数据报套接字上,此错误将显示以前发出的操作导致出现 ICMP“无法访问端口”消息。
WSAEFAULT
buf 参数未完全包含在用户地址空间的有效部分。
WSAEINPROGRESS
阻止 Windows Sockets 1.1 调用正在进行,或者服务提供程序仍在处理回调函数。
WSAEINTR
WSACancelBlockingCall 调用取消了 (阻止) 调用。
WSAEINVAL
套接字未绑定 绑定,或者指定了未知标志,或者为启用了SO_OOBINLINE的套接字指定了MSG_OOB,或者仅对字节流套接字 () len 为零或负数。
WSAENETDOWN
网络子系统失败。
WSAENETRESET
对于面向连接的套接字,此错误表示连接已中断,因为 保持活动 活动检测到操作正在进行时失败。 对于数据报套接字,此错误显示生存时间已经过期。
WSAENOTCONN
套接字未连接。
WSAENOTSOCK
:描述符不是套接字。
WSAEOPNOTSUPP
MSG_OOB已指定,但套接字不是流样式(如类型SOCK_STREAM),与此套接字关联的通信域中不支持 OOB 数据,或者套接字是单向的,仅支持发送操作。
WSAESHUTDOWN
套接字已关闭;在调用关闭后,无法在套接字上使用 WSARecvEx,同时如何将 设置为 SD_RECEIVE 或 SD_BOTH。
WSAETIMEDOUT
因为网络故障或对等系统无法响应,已经丢弃了连接。
WSAEWOULDBLOCK
套接字标记为非阻止,接收操作将阻止。
WSANOTINITIALISED
在使用此函数之前,必须成功调用 WSAStartup

注解

作为 Windows 套接字 2 的 Microsoft 实现的一部分的 WSARecvEx 函数类似于更常见的 recv 函数,只不过 flags 参数用于单个特定目的。 flags 参数用于指示在使用面向消息的协议时是接收部分消息还是完整消息。

标志参数指向的值在输入时将被忽略。 因此,不能将标志传递给 WSARecvEx 函数来修改其行为。 flags 参数指向的值在输出中设置。 这与 recvWSARecv 函数不同,在输入时 由 flags 参数指向的值可以修改函数的行为。

对于面向流的协议, WSARecvExrecv 函数的行为相同。

flags 参数适用于接收部分消息的两种常见情况:

  • 当应用程序的数据缓冲区大小小于消息大小,并且消息恰巧分两部分到达时。
  • 当消息相当大并且必须到达多个部分时。
当收到部分消息时,从 WSARecvEx 返回时,在 flags 参数指向的值中设置MSG_PARTIAL位。 如果收到完整的消息,则未在 flags 参数指向的值中设置MSG_PARTIAL。

recv 函数不同于
WSARecvExWSARecv 函数,即 recv 函数始终接收面向消息的传输协议的每个调用的单个消息。 recv 函数也没有向应用程序指示接收的数据只是部分消息的方法。 应用程序必须构建自己的协议,以便在每次调用 recv 后检查错误代码 WSAEMSGSIZE,以检查消息是部分消息还是完整消息。 当应用程序缓冲区小于要发送的数据时,会将尽可能多的消息复制到用户的缓冲区中,并 返回 错误代码 WSAEMSGSIZE。 对 recv 的后续调用将获取消息的下一部分。

如果应用程序的数据传输协议无法保证消息大小调整,则应为面向消息的传输协议编写的应用程序进行编码。 应用程序可以使用 recv 并管理协议本身。 或者,应用程序可以使用 WSARecvEx 并检查在 flags 参数中设置MSG_PARTIAL位。

WSARecvEx 函数为开发人员提供了一种更有效的方法来检查在非常大的消息以增量方式到达时收到的消息是部分的还是完整的。 例如,如果应用程序发送一兆字节的消息,则传输协议必须分解该消息,以便通过物理网络发送该消息。 理论上,接收端的传输协议可以缓冲消息中的所有数据,但这在资源方面相当昂贵。 相反,可以使用 WSARecvEx ,从而最大程度地减少开销并消除对基于应用程序的协议的需求。

注意 当给定线程退出时,将取消由该线程发起的所有 I/O。 对于重叠的套接字,如果在操作完成之前关闭线程,挂起的异步操作可能会失败。 有关详细信息,请参阅 ExitThread 函数。
 

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 winsock.h (包括 Mswsock.h)
Library Mswsock.lib
DLL Mswsock.dll

另请参阅

WSAAsyncSelect

WSARecv

Winsock 函数

Winsock 参考

recv

recvfrom

select

send

socket