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函数一直在等待….
- 发送紧急数据,紧急方式接收