一组影响此函数行为的标志。 请参阅下面的备注。 有关此参数可能值的详细信息,请参阅“备注”部分。
如果未发生错误,
recv
将返回收到的字节数,
buf
参数指向的缓冲区将包含接收的此数据。 如果连接已正常关闭,则返回值为零。
否则,将返回SOCKET_ERROR值,并且可以通过调用
WSAGetLastError
来检索特定的错误代码。
recv
函数用于读取面向连接的套接字或无连接套接字上的传入数据。 使用面向连接的协议时,必须在调用
recv
之前连接套接字。 使用无连接协议时,必须在调用
recv
之前绑定套接字。
套接字的本地地址必须已知。 对于服务器应用程序,请使用显式
绑定
函数或隐式
接受
或
WSAAccept
函数。 客户端应用程序不建议显式绑定。 对于客户端应用程序,套接字可以使用
connect
、
WSAConnect
、
sendto
、
WSASendTo
或
WSAJoinLeaf
隐式绑定到本地地址。
对于连接套接字或无连接套接字,
recv
函数限制接收消息的地址。 该函数仅从连接中指定的远程地址返回消息。 其他地址的邮件 (被无提示) 丢弃。
对于面向连接的套接字, (类型SOCK_STREAM例如) ,调用
recv
将返回当前可用的数据量(最大为指定缓冲区的大小)。 如果套接字已配置为对 OOB 数据进行内联接收, (套接字选项SO_OOBINLINE) 且 OOB 数据尚未读取,则仅返回 OOB 数据。 应用程序可以使用
ioctlsocket
或
WSAIoctl
SIOCATMARK
命令来确定是否要读取更多 OOB 数据。
对于无连接套接字 (类型SOCK_DGRAM或其他面向消息的套接字) ,数据是从
连接
函数指定的目标地址 (消息) 提取的第一个排队数据报。
如果数据报或消息大于指定的缓冲区,则缓冲区将填充数据报的第一部分,并
重新生成
错误
WSAEMSGSIZE
。 例如,对于不可靠的协议 (,UDP) 多余的数据丢失;对于可靠的协议,数据由服务提供商保留,直到通过调用足够大的缓冲区
的 recv
成功读取数据。
如果套接字上没有可用的传入数据,
则 recv
调用会阻止数据,并等待数据根据为
WSARecv
定义的阻止规则(未设置MSG_PARTIAL标志)到达,除非套接字未阻止。 在这种情况下,返回一个值SOCKET_ERROR,错误代码设置为
WSAEWOULDBLOCK
。
选择
、
WSAAsyncSelect
或
WSAEventSelect
函数可用于确定何时到达更多数据。
如果套接字面向连接,并且远程端已正常关闭连接,并且已接收所有数据,
则 recv
将立即完成,并接收零字节。 如果连接已重置,
则 recv
将失败并出现
WSAECONNRESET
错误。
标志
参数可用于影响函数调用的行为,这些行为超出了为关联套接字指定的选项。 此函数的语义由套接字选项和
标志
参数确定。 标志
参数的
可能值是使用以下任一值的按位 OR 运算符构造的。
MSG_PEEK
查看传入数据。 数据将复制到缓冲区中,但不会从输入队列中删除。
MSG_OOB
处理带外 (OOB) 数据。
MSG_WAITALL
仅当发生以下事件之一时,接收请求才会完成:
-
调用方提供的缓冲区已完全满。
-
该连接已关闭。
-
请求已被取消或出错。
请注意,如果基础传输不支持MSG_WAITALL,或者套接字处于非阻塞模式,则此调用将失败并出现
WSAEOPNOTSUPP
。 此外,如果指定了MSG_WAITALL以及MSG_OOB、MSG_PEEK或MSG_PARTIAL,则此调用将失败并出现
WSAEOPNOTSUPP
。 数据报套接字或面向消息的套接字不支持此标志。
注意
发出阻止 Winsock 调用(如
recv
)时,Winsock 可能需要等待网络事件,然后才能完成呼叫。 在这种情况下,Winsock 会执行可警报的等待,这可以通过异步过程调用 (APC) 在同一线程上计划的异步过程调用中断。 在同一线程上中断持续阻塞 Winsock 调用的 APC 中发出另一个阻止 Winsock 调用将导致未定义的行为,并且永远不会由 Winsock 客户端尝试。
下面的代码示例演示
了 recv
函数的使用。
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
int __cdecl main() {
//----------------------
// Declare and initialize variables.
WSADATA wsaData;
int iResult;
SOCKET ConnectSocket = INVALID_SOCKET;
struct sockaddr_in clientService;
char *sendbuf = "this is a test";
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
//----------------------
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return 1;
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( 27015 );
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
if ( iResult == SOCKET_ERROR) {
closesocket (ConnectSocket);
printf("Unable to connect to server: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
printf("Bytes Sent: %ld\n", iResult);
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
// Receive until the peer closes the connection
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
printf("recv failed: %d\n", WSAGetLastError());
} while( iResult > 0 );
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
有关详细信息,以及 recv 函数的另一个示例,请参阅使用 Winsock 入门。
Windows Phone 8:Windows Phone 8 及更高版本上Windows Phone应用商店应用支持此函数。
Windows 8.1和Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。