|
函数原型:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
参数说明:
第 1 个参数 sockfd 表示正在监听端口的套接口文件描述符,由 socket() 生成。 第 2 个参数 buf 表示接收数据缓冲区,接收到的数据将放在这个指针所指向的内存空间中。 第 3 个参数 len 表示接收数据缓冲区的大小,系统根据这个值来确保接收缓冲区的安全,防止溢出。 第 4 个参数 flags 是设置标志,一般设为 0。 第 5 个参数 *src_addr 指向本地的数据结构 sockaddr_in 的指针,发送数据时发送方的地址信息存放在这个结构中。 第 6 个参数 *addrlen 表示的是第 5 个参数所指的内容长度,可以使用 sizeof (struct sockaddr_in) 来获得。 recvfrom() 出错时返回 -1;成功时返回接收到的数据长度,数据的长度可以为 0,因此如果函数返回值为 0 并不表示发生了错误,仅能表示此时系统中接收不到数据。发生错误时,错误值保存在 errno 中,errno 的值和含义如下表所示:
值
| 含义
| EGAIN
| 接收超时,或者套接字描述符设置为非阻塞,而此时没有数据
| EGAIN/EWOULDBLOCK
| 此socket使用了非阻塞模式,当前情况下没有可接受的连接
| EBADF
| 描述符非法
| ECONNABORTED
| 连接取消
| EINTR
| 信号在合法连接到来之前打断了 accept 的系统调用
| EINVAL
| socket没有侦听连接或者地址长度不合法
| EMFILE
| 每个进程允许打开的文件描述符数量最大值已经到达
| ENFILE
| 达到系统允许打开文件的总数量
| ENOTSOCK
| 文件描述符是一个文件,不是 socket
| EOPNOTSUPP
| 引用的 socket 不是流类型 SOCK_STREAM
| EFAULT
| 参数 addr 不可写
| ENOBUFS/ENOMEM
| 内存不足
| EPROTO
| 协议错误
| EPERM
| 防火墙不允许连接
|
|
|