带外数据和带内数据的解释:带外数据时用于迅速告诉对方本端发送的重要数据,因此带外数据比普通数据由更高的优先级。这里提到的普通数据就可以理解为带内数据。
socket编程对带外数据的处理分为两部分:发送端和接收端。
一、发送端
首先说明UDP是没有带外数据传输的,TCP也没有严格的带外数据传输,但是TCP利用头部的紧急指针标志和紧急指针两个字段给了应用程序一个紧急方式,TCP正是利用这种紧急方式来传递紧急数据的。
二、接收端
TCP通信两端的读写是通过recv和send两个函数。这两个函数都有一个参数是flag,flag参数为数据的收发提供了额外的控制,比如设置flag=MSG_WAITALL表示读操作在读取指定数量的字节后才可以返回。有比如设置flag=MSG_OOB,表示发送或者接收的数据为紧急数据。
检测带外数据:
当数据到达接收端缓冲区时,Linux内核通过检测TCP紧急标识就会通知应用程序有带外数据需要接收。通知带外数据到来的方式有I/O复用产生的异常事件和SIGURG信号。
找到带外数据的具体位置:
得知数据达到了,需要知道带外数据在数据流中的具体位置,才能准确的接收带外数据。这可以通过**int sockatmark(int sockfd)**的系统调用来实现,sockatmark判断sockfd是否处于带外标记,即下一个读取的数据是否是带外数据,如果是则返回1,此时就可以使用recv函数进行接收带外数据,如果不是返回0.