recv 子例程
用途
从已连接的套接字接收消息。
库
标准 C 库 (libc.a)
语法
描述
recv 子例程从连接的套接字接收消息。 recvfrom 和 recvmsg 子例程接收来自已连接套接字和未连接套接字的消息。 但是,它们通常仅用于未连接的套接字。
recv 子例程返回消息的长度。 如果消息太长而无法在提供的缓冲区中容纳,那么根据发出消息的套接字的 类型 ,可能会截断多余的字节。
如果套接字上没有可用的消息,那么 recv 子例程将等待消息到达,除非套接字是非分块的。 如果套接字是非分块的,那么系统将返回错误。
使用 select 子例程来确定何时到达更多数据。
可以在定义了 COMPAT_43 的情况下编译套接字应用程序。 这将使 sockaddr 结构 BSD 4.3 兼容。 有关更多详细信息,请参阅 socket.h。
参数
| 项 | 描述 |
|---|---|
| 套接字 | 指定套接字描述符。 |
| 缓冲区 | 指定应放置消息的地址。 |
| 长度 | 指定 Buffer 参数的大小。 |
| 标志 | 指向控制消息接收的值。 /usr/include/sys/socket.h 文件定义 Flags 参数。 用于接收调用的自变量由以下一个或多个值在逻辑上进行 OR 运算构成:
|
返回值
成功完成时, 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 | 套接字被标记为无阻塞,并且不存在要接受的连接。 |