目录索引

  • send函数和recv函数
    • write()/read() 与 send()/recv() 的区别
    • 函数原型
    • MSG_OOB(带外数据/紧急数据)
    • MSG_PEEK(数据窥探)
    • MSG_DONTWAIT(立即收发模式)
    • 阻塞发送模式(flags: 0)
    • MSG_WAITALL(等待数据)
    • MSG_MORE(更多数据)

send函数和recv函数

write()/read() 与 send()/recv() 的区别

  • 由于两组函数的都能通过文件描述符收发网络数据,所以两组函数在功能上有一定的重叠;
  • 但是,send/recv函数在数据收发上功能更专业更齐全;

函数原型

  • 头文件包含:#include <sys/socket.h>
  • 函数原型:
ssize_t  send(int sockfd,const void * buf, size_t nbytes, int flags);
ssize_t  recv(int sockfd,void * buf, size_t nbytes, int flags);
  • flags:收发数据时指定的可选信息;
    当flags为0时, send等待发送缓冲区清空后把数据放入缓冲区再返回(有可能等待),recv等待数据缓冲区有数据后获取再返回(有可能等等待);
    当flags为0时, send()/recv() 在功能上等价于 write()/read() ;
  • flags可选配置:
可选项 含义 send recv
MSG_OOB 用于传输带外数据(Out Of Band data),即:紧急数据
MSG_PEEK 窥探接收缓冲区是否存在数据
MSG_DONTROUTE 数据传输过程不通过路由,在本地局域网中寻找目的地
MSG_DONTWAIT 非阻塞模式,数据收发时立即返回
MSG_WAITALL 在接收到请求的全部数据之前,不提前返回
MSG_MORE 有更多数据需要发送,指示内核等待数据

注意:不同操作系统对可选项的支持不同,实际工程开发时,需要事先对目标系统中支持的可选项进行调研

MSG_OOB(带外数据/紧急数据)

  • 原生定义:
    – 使用与普通数据不同的通道独立传输数据;
    – 带外数据优先级比普通数据高(优先传输,对端优先接收);
  • TCP中的带外数据:
    – 由于原生设计的限制,TCP无法提供真正意义上的带外数据
    – TCP中仅能通过传输协议消息头中的标记传输紧急数据,且长度仅1字节
  • TCP带外数据实现的原理:
URG URG指针 0x01 0x02 带外数据 URG指针指向的位置

URG指针指向紧急消息的下一个位置,即:URG指针指向位置的前一个字节存粗了紧急数据;
紧急数据会放在有别于普通数据的特殊数据缓冲区;

  • TCP带外数据的处理策略:
    – 由于TCP设计为流式数据,因此,无法做到真正的带外数据;
    – 被标记的紧急数据可被提前接收,进入特殊缓冲区(仅1个字节);
    · 每个TCP包最多只有一个紧急数据
    · 特殊缓冲区仅存放最近的紧急数据(不及时接收将丢失)
  • 使用select接收紧急数据
    – socket上收到普通数据和紧急数据时都会使得select立即返回(通过FD_ISSET监测 select返回的exceptset参数来判断是否是紧急数据);
    · 普通数据:socket处于数据可读状态(可读取普通数据);
    · 紧急数据:socket处于处理异常状态(可读取紧急数据);
  • 总结:
    read/write函数可用于收发普通数据(不具备扩展功能)
    send/recv可通过选项信息扩展更多功能
    TCP紧急数据可标识256(1个字节,2^8)种紧急事件(异常事件)
    通过select能够及时处理紧急数据并区分普通数据

MSG_PEEK(数据窥探)

  • recv()专用选项,可用于数据预接收;
  • 指定MSG_PEEK选项时,不会清空缓冲区;
  • 可用于获取接收缓冲区中的数据量(字节数);

MSG_DONTWAIT(立即收发模式)

  • 数据收发时不阻塞,立即返回;
  • send() :如果无法将数据送入发送缓冲区,那么直接错误返回;
  • recv() :如果接收缓冲区中没有数据,那么直接错误返回;
  • send()/recv()返回值:-1:错误发生,0:对端调用close()关闭连接,n:发送/接收的数据量

阻塞发送模式(flags: 0)

  • send():
    发送数据长度 > 发送缓冲区长度 : 返回错误
    发送数据长度 <= 发送缓冲区剩余长度复制数据到发送缓冲区
    发送缓冲区剩余长度<发送数据长度<=发送缓冲区长度等待发送缓冲区清空
  • recv():
    接收缓冲区中没有数据时等待数据
    接收缓冲区数据量 <= 接收区长度数据全部拷贝到接收区
    接收缓冲区数据量 > 接收区长度拷贝部分数据到接收区

MSG_WAITALL(等待数据)

  • 接收专用,等待需要的数据量完全满足时,recv()才返回

MSG_MORE(更多数据)

  • 发送专用,指示内核不要着急将发送缓冲区中的数据进行传输

send函数和recv函数相关推荐

  1. linux socket send函数和recv函数详解以及修改缓冲区大小

    一.send/recv详解 1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程 ...

  2. Socket send函数和recv函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  3. Socket中send()函数和recv()函数详解

    目录 1.send函数 2.recv函数 关于socket的send和recv的超时设置 1.send函数 int send( SOCKET s, const char FAR *buf, int l ...

  4. java socket recv_Socket send函数和recv函数详解

    int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据 ...

  5. Socket_send函数和recv函数详解

    int send( SOCKETs,     const char FAR*buf,     intlen,     int flags );   不论是客户还是服务器应用程序都用send函数来向TC ...

  6. java socket send_Socket send函数和recv函数详解

    int send( SOCKET s,      const char FAR *buf,      int len,      int flags ); 不论是客户还是服务器应用程序都用send函数 ...

  7. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  8. send(),recv()函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  9. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

最新文章

  1. AngularJS的使用方法
  2. 万维钢新书《你有你的计划,世界另有计划》_《丑小鸭定理》读书笔记
  3. 自学python系列14:映像,集合类型-集合类型
  4. 【C++深度剖析教程3】C++中类的静态成员变量
  5. 2020年视频号发展白皮书
  6. 随手记android面试题,微众银行风险模型面试随手记(一面+二面)
  7. 切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
  8. 软件测试面试题小结(一)
  9. educoder实训平台linux,educoder平台hadoop开发环境搭建[技术学习]
  10. 网吧操作系统制作和优化的经验
  11. 撰写美国作业使用APA与MLA格式的区别是什么?
  12. Raid5数据恢复原理_两块盘离线数据恢复方法
  13. nginx80转443
  14. 解决Windows server 2003不认U盘
  15. 在我的新书里,尝试着用股票案例讲述Python爬虫大数据可视化等知识
  16. jquery点击图片进行放大缩小
  17. Mybatis03-封装MybatisUtil实体类
  18. 关于python的漫画_不能错过的Python漫画
  19. keras+learning
  20. 微信公众号发送消息 Java

热门文章

  1. 数据库(mysql)表的五大约束条件
  2. 处理接口幂等性的两种常见方案
  3. 【MFC】学习笔记:文件操作类——CFile
  4. 音乐社会计算机英语,计算机音乐技术应用,Computer music technology application,音标,读音,翻译,英文例句,英语词典...
  5. 按键判断之GetKeyState 和 GetAsyncKeyState 区别
  6. Diabetes 糖尿病及其并发症.|2021/1/25(未完待续)
  7. 2022年危险化学品经营单位主要负责人最新解析及危险化学品经营单位主要负责人考试资料
  8. Android调试高德SDK,如何获取SHA1?
  9. 白盒测试之逻辑覆盖准则
  10. 北京离职自己上社保哪个靠谱