当前位置: 首页 > news >正文

Linux网络编程之recv函数

功能

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_CLOEXEC
MSG_DONTWAIT
MSG_ERRQUEUE
MSG_OOB
MSG_PEEK
MSG_TRUNC
MSG_WAITALL

返回值

  • 成功:接收到的字节数
  • 失败:-1,并设置 errno
  • 其他:当出现如下情况时,返回0
    • 当流套接字(socket 函数中参数 type = SOCK_STREAM)对端关闭连接时,返回值将为0;
    • UNIX 和 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 函数返回-1,errno == ENOENT。这种情况是接收端未处理完数据就去关闭连接,TCP 协议会直接发 RST 报文关闭连接,参考:https://blog.csdn.net/knowledgebao/article/details/84644233
http://www.lryc.cn/news/89222.html

相关文章:

  • ChatGPT免费使用的方法有哪些?
  • 【华为OD机试】找朋友【2023 B卷|100分】
  • 【教学类-35-01】带笔画步骤图的描字(姓氏)(A4整张)
  • 关于PyQt5的环境搭建
  • rsync+inotfy实时同步
  • Python代码写好了怎么运行
  • 2023 年的 Web Worker 项目实践
  • C++的最后一道坎 | 百万年薪的程序员
  • Unity的OnOpenAsset:深入解析与实用案例
  • 【Netty】Netty 程序引导类(九)
  • 如何使用进行MQ中间件接口测试
  • Zebec生态进展迅速,频被BitFlow、Matryx DAO等蹭热度碰瓷
  • 7种PCB走线方式
  • Rabbit SpringBoot高级用法
  • 找不到vcruntime140.dll,无法继续执行代码?多种解决方法解析
  • 自然语言处理实战项目8- BERT模型的搭建,训练BERT实现实体抽取识别的任务
  • pdf怎么合并在一起?软件操作更高效
  • Junit常见用法
  • c++—内存管理、智能指针、内存池
  • JAVA使用HTTP代码示例
  • 【网络协议详解】——电子邮件系统协议(学习笔记)
  • 年度发布 | MeterSphere一站式开源持续测试平台发布v2.10 LTS版本
  • 从 OceanBase 迁移数据到 DolphinDB
  • 淘宝商品列表数据接口(支持价格、销量排序)
  • Android 11 版本变更总览
  • 传染病学模型 | Matlab实现基于SIS传染病模型模拟城市内人口的互相感染及城市人口流动所造成的传染
  • 物联网技术如何改变我们的生活:一位资深物联网专家的见解
  • node.js+vue.js大学生在线选课系统的设计与实现93pul
  • 华为OD机试真题 Java 实现【寻找符合要求的最长子串】【2023Q1 200分】
  • 接口测试工具Postman接口测试图文教程