一组影响此函数行为的标志。 请参阅下面的备注。 有关此参数可能值的详细信息,请参阅“备注”部分。

如果未发生错误, 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.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。