Linux 网络开发必学课程(六)数据收发的扩展用法

13数据收发的扩展用法(上)

① 问题

        write()和send()都可以发送数据,有什么区别?

        read()和recv()都可以接收数据,有什么区别? 

② 数据收发选项

        

        调用时flags参数的值为0,表示什么?默认收发网络数据

  • send如果发送缓冲区中有数据,等到被清空,再送到发送缓冲区,send有可能等待。
  • recv等到接收缓冲区有数据,把数据拷贝出来才返回,recv也等待。
  • write   ==> send (….,0)
  • read    ==> recv  (….,0)

③ flags选项信息(常用)

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

④ MSG_OOB(带外数据,紧急数据)

  • 原生定义
    • 使用与普通数据不同的通道独立传输的数据
    • 带外数据优先级比普通数据优先传输,对端优先接收
  • TCP中的带外数据
    • 由于原生设计的限制,TCP无法提供真正意义上带外数据(TCP为流式传输,数据连绵不绝、按序传输)
    • TCP中仅能通过传输协议消息头中的标记,传输紧急数据,且长度仅1字节

⑤ TCP带外数据实现原理

  •  TCP==>包形式传输==>报文
  • URG指针(数据头中)指向紧急消息的下一个位置,即:URG指针
    • 指向位置的前一个字节存储了紧急消息(后发送,先接受)
  • 接收到先接收到0x03,放到一个特殊的缓冲区(1字节)

⑥ TCP带外数据处理策略

  • 由于TCP设计为流式数据,因此,无法做到真正的带外数据
  • 被标记的紧急数据可被提前接收,进入特殊缓冲区(1字节)
    • 每个TCP包最多只有一个紧急数据(1字节)
    • 特殊缓冲区仅存放最近的紧急数据(不及时接收将丢失)
    • 用下面的方式收发数据会发生什么?
      • 发送普通数据,普通方式接收 send (….,0) recv  (….,0) 发什么收什么
      • 发送普通数据紧急方式接收 错误返回紧急方式到特殊缓冲区接收,但是发送是普通数据,所以不会有数据接收
      • 发送紧急数据普通方式接收 紧急方式把数据发送到到特殊缓冲区接收,但是一直在普通缓冲区里收是收不到的,所以recv函数一直在等待….
      • 发送紧急数据紧急方式接收
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值