苏州市吴中区住房和城乡建设局官方网站,长春网站建设方案服务,外贸企业网络营销,广西桂林电子科技大学功能
recv 函数的功能就是从套接字中接收数据。
头文件
#include sys/types.h
#include sys/socket.h原型
ssize_t recv(int sockfd, void *buf, size_t len, int flags);参数
参数描述sockfdsocket 文件描述符buf接收数据缓冲区len接收数据缓冲区的大小f…功能
recv 函数的功能就是从套接字中接收数据。
头文件
#include sys/types.h
#include sys/socket.h原型
ssize_t recv(int sockfd, void *buf, size_t len, int flags);参数
参数描述sockfdsocket 文件描述符buf接收数据缓冲区len接收数据缓冲区的大小flags标志一般置0若需要设置多个标志则通过 “或” 逻辑进行连接
flags 可以设置为如下几种
flags 标志MSG_CMSG_CLOEXECMSG_DONTWAITMSG_ERRQUEUEMSG_OOBMSG_PEEKMSG_TRUNCMSG_WAITALL
返回值
成功接收到的字节数失败-1并设置 errno其他当出现如下情况时返回0 当流套接字socket 函数中参数 type SOCK_STREAM对端关闭连接时返回值将为0UNIX 和 Internet 域数据报套接字允许长度为0的数据报。当接收到这样的数据报时返回值为0当流套接字对端发送长度为0的数据段也可以返回值0。
errno 的值可能是
错误值解释EAGAIN(11)套接字已标记为非阻塞调用 recv 读取数据而此时没有数据可读则返回该错误EWOULDBLOCK含义同 EAGAIN但是错误值可能不同于EAGAIN所以这两个错误值都需要检查EBADF(9)参数 sockfd 不是有效的描述符ECONNREFUSE远程主机阻绝网络连接EFAULT(14)接收缓冲区指针参数 buf指向进程地址空间之外EINTR(4)操作被信号中断EINVAL(22)参数无效ENOMEM(12)无法为 recvmsg 函数分配内存ENOTCONN与面向连接关联的套接字尚未被连接上如 TCP 协议未连接就通过调用 recv 接收数据ENOTSOCK文件描述符 sockfd 没有引用套接字ENOENT(2)没有该文件或目录接收端未处理完缓冲区数据就关闭套接字详见下文
特别 当函数的返回值为-1并且 (errno EINTR || errno EWOULDBLOCK || errno EAGAIN) 的情况下认为当前连接是正常的可以继续接收数据。在项目中还遇到过接收端未处理完缓冲区数据就关闭套接字的情况此时接收端未发送长度为0的消息到发送端发送端调用 recv 函数返回-1errno ENOENT。这种情况是接收端未处理完数据就去关闭连接TCP 协议会直接发 RST 报文关闭连接参考https://blog.csdn.net/knowledgebao/article/details/84644233