【网络编程】TCP带外数据总结

本文详细介绍了带外数据的基本概念,包括其在TCP和UDP中的应用,以及如何通过MSG_OOB参数进行读写。还探讨了检测带外数据到达的方法,如select的异常事件和SIGURG信号,以及使用sockatmark函数进行标记。
摘要由CSDN通过智能技术生成


一、带外数据基本知识

  带外数据(Out Of Band,OOB),用于迅速通告对方本端发生的重要事件,所以它比一般数据具有更高的优先级,其传输既可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。在实际的应用中,带外数据的使用比较少见,已知的仅有telnet、ftp等远程非活跃程序。
  虽然TCP和UDP中都没有真正的带外数据,但是TCP利用其头部中的紧急指针标志和紧急指针字段来传输紧急数据,给应用程序提供了一种传输紧急数据的方式,这种传输紧急数据的方式与带外数据类似,所以TCP紧急数据也就可以被称为带外数据。
  带外缓存,这个缓存只有1B,用来接收带外数据,根据紧急指针所指的位置确定带外数据的位置。如果上层应用程序没有及时将带外数据从带外缓存中读出,则后续数据将会覆盖它。

二、带外数据的读写

  TCP连接使用MSG_OOB参数在函数send以及recv中实现对带外数据的读写,由于带外缓存只有1B,所以在传输字符串的时候只有最后一个字节会被保存在带外缓存中进行传输。比如在以下程序的接收中,如果客户端依次传输“123”,“abc”,“123”这三次消息:

memset(buffer, '\0'. BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, 0);
printf("got %d bytes of normal data '%s'\n", ret, buffer);
memset(buffer, '\0'. BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, MSG_OOB);
printf("got %d bytes of oob data '%s'\n", ret, buffer);
memset(buffer, '\0'. BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, 0);
printf("got %d bytes of normal data '%s'\n", ret, buffer);

  其结果为

got 5 bytes of normal data '123ab'
got 1 bytes of oob data 'c'
got 3 bytes of normal data '123'

  由此可见,使用MSG_OOB参数对带外数据进行传输,会迫使TCP连接切断数据流,以带外数据为分割点,正常数据’123ab‘和’123‘是不能一起被读出的。
(具体样例在《linux高性能服务器编程》P84-P85》

三、检测带外数据是否到达

3.1、select上的异常事件

  socket上面接收到正常数据和带外数据都将会使select返回,如果接收到正常数据socket将会处于可读状态,如果接受到带外数据,socket将会处于异常状态,通过判断socket的状态即可判断带外数据是否到达。

3.2、SIGURG信号

四、带外标记

  这里我们主要使用sockatmark函数来判断当前的socket是否处于带外标记,即下一个被读取到的数据是否是带外数据。

#include <sys/socket.h>
int sockatmark(int sockfd);

  如果下一个数据是带外数据的话,sockatmark返回1,不是的话返回0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rockict_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值