socket编程之带外数据的处理

本文详细介绍了TCP/IP协议中带外数据的概念及其在socket编程中的处理方式。在发送端,TCP利用紧急指针标志传递紧急数据;在接收端,通过I/O复用和SIGURG信号检测带外数据,并使用sockatmark系统调用来确定数据的位置。了解这些机制对于理解和优化网络通信性能至关重要。
摘要由CSDN通过智能技术生成

带外数据和带内数据的解释:带外数据时用于迅速告诉对方本端发送的重要数据,因此带外数据比普通数据由更高的优先级。这里提到的普通数据就可以理解为带内数据

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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值