recv 子例程

用途

从已连接的套接字接收消息。

标准 C 库 (libc.a)

语法

#include <sys/socket.h>
int recv (Socket,
Buffer, Length, Flags)
int  Socket;
void * Buffer;
size_t  Length;
int  Flags;

描述

recv 子例程从连接的套接字接收消息。 recvfromrecvmsg 子例程接收来自已连接套接字和未连接套接字的消息。 但是,它们通常仅用于未连接的套接字。

recv 子例程返回消息的长度。 如果消息太长而无法在提供的缓冲区中容纳,那么根据发出消息的套接字的 类型 ,可能会截断多余的字节。

如果套接字上没有可用的消息,那么 recv 子例程将等待消息到达,除非套接字是非分块的。 如果套接字是非分块的,那么系统将返回错误。

使用 select 子例程来确定何时到达更多数据。

可以在定义了 COMPAT_43 的情况下编译套接字应用程序。 这将使 sockaddr 结构 BSD 4.3 兼容。 有关更多详细信息,请参阅 socket.h

参数

描述
套接字 指定套接字描述符。
缓冲区 指定应放置消息的地址。
长度 指定 Buffer 参数的大小。
标志 指向控制消息接收的值。 /usr/include/sys/socket.h 文件定义 Flags 参数。 用于接收调用的自变量由以下一个或多个值在逻辑上进行 OR 运算构成:
MSG_OOB
处理频带外数据。 频带外数据的重要性取决于协议。
MSG_PEEK
对传入数据进行 peeks。 数据将继续被视为未读,并将由下一次调用 recv () 或类似函数来读取。
MSG_WAITALL
请求在读取所请求的字节数之前不返回该函数。 仅当捕获到信号,终止连接或套接字的错误处于暂挂状态时,该函数返回的字节数才能少于所请求的字节数。

返回值

成功完成时, recv 子例程返回消息的长度 (以字节为单位)。

如果 recv 子例程不成功,那么子例程处理程序将执行以下函数:

  • 会向调用程序返回-1的值。
  • 如果连接断开,那么返回 0。
  • 将指示特定错误的错误代码移动到 errno 全局变量中。

错误代码

如果发生以下任何错误,那么 recv 子例程不成功:

错误 描述
EBADF Socket 参数无效。
ECONNRESET 远程同级强制关闭连接。
Efault 指示将数据接收到进程地址空间的不存在或受保护的部分中。 Buffer 参数无效。
EINTR 在任何数据可用之前,信号中断了 recv 子例程。
EINVAL 设置了 MSG_OOB 标志,并且没有频带外数据可用。
ENOBUF 系统中没有足够的可用资源来执行操作。
ENOTCONN 在未连接的 SOCK_STREAM 套接字上尝试接收。
ENOTSOCK Socket 参数引用文件,而不是套接字。
EOPNOTSUPP SOCK_DGRAM 套接字设置 MSG_OOB 标志,或为任何 AF_UNIX 套接字设置 MSG_OOB 标志。
时间已到 连接建立期间连接超时,或者活动连接上存在传输超时。
EWOULDBLOCK 套接字被标记为无阻塞,并且不存在要接受的连接。