OOB(out-of-band data)

news/2024/5/17 15:51:02 标签: tcp, socket, stream, application, header, byte
OOB(out-of-band data)(综合编辑)
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如过通信一放有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道.linux系统的套接字机制支持低层协议发送和接受带外数据.但是TCP协议没有真正意义上的带外数据.为了发送重要协议,TCP提供了一种称为紧急模式(urgentmode)的机制.TCP协议在数据段中设置URG位,表示进入紧急模式.接收方可以对紧急模式采取特殊的处理.注意OOBD每次只能发送一个字节的数据。
1. 带外数据的发送。
函数: send(fd, 'a', 1, MSG_OOB);
tcp内核:不管什么情况(忽略掉nagle算法和窗口大小等因素),立刻发送一个urg包给对端,告诉对方我要发送OOB了和这个内容的位置。需要注意的是,实际的‘a'内容也是通过正常的发送缓冲区发送出去的。当发送区满的时候或是通告的窗口为0,紧急数据本身实际上也阻塞了,不管怎样至少一个urg通知包是发给对方了。但是此时接收端试图读取该紧急数据时,就会返回一个EWOULDBLOCK错误

2. 带外数据的接收。
默认情况下,带外数据是存放在专门的一个字节的带外数据缓冲区中的。一个tcp连接只有一个带外数据,第二个到来的带外数据会覆盖第一个到来的带外数据(如果程序没有处理第一个到来的带外数据的话)
函数: a. 通过信号处理SIGURG,过程首先设置文件描述字的进程属主,fcntl(sockfd, F_SETOWN,getpid());然后注册SIGURG信号处理句柄并且在句柄里面读取带外数据
b. select的异常条件。当带外数据到达时,sockfd会产生异常。但是需要注意的情况是,sockfd上的异常不会自动清除。当读取过带外数据之后,应该先将sockfd从异常fd_set中移除(否则将会进入死循环,一直检测到异常,然后读取带外数据,但是带外数据已经在第一次时就被读取了,于是就会返回EINVAL的错误),然后等待读取一部分正常数据之后,再设置sockfd到异常fd_set

c. 通过设置SO_OOBINLINE 和sockatmark()函数。首先设置SO_OOBINLINE在普通接收缓冲区中接收带外数据。然后程序读取该缓冲区时结合seockatmark检测是否当前位置属于带外数据区。注意,假设这样的而一个缓冲区内容123456x789.其中x为带外数据。read时内核会将123456和x789中间做标记。程序读取到x时会自动停住。然后下次继续读取剩下的(这是通过sockatmark就会发现处于带外数据区,此时如果read(sockfd,buf, 1)的话buf里面就时带外数据了(x).




http://www.niftyadmin.cn/n/1436341.html

相关文章

利用MFC消息映射机制自定义消息

Windows系统中的程序大部分都是通过消息和事件驱动的。在windows下的应用程序主要工作是进行消息的循环处理,通过循环等待消息的到来和事件的发生,然后对不同的消息和事件运行相关的代码,完成相应的操作。Windows提供了大量的消息&#xff0c…

cstring 和char * 的转换

CString 头文件#include <afx.h> string 头文件#include <string.h> CString 转char * CString cstr; char *p (LPSTR)(LPCTSTR)cstr; string 转 CString CString.format(”%s”, string.c_str()); char 转 CString CString.format(”%s”, char*); char 转 strin…

const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令

const类型定义&#xff1a;指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令 **************常量必须被初始化*************************cons的作用&#xff08;1&#xff09;可以定义const常量 例如&#xff1a;const int Max100;int Array[Max]; …

Windows编程基础- 设备对象属性

源地址&#xff1a;http://www.2cto.com/kf/201008/54515.html 设备对象属性决定着绘图方式&#xff0c;当使用GDI函数绘图时&#xff0c;所绘制的图形和文本的颜色、大小和位置等由设备对象的当前属性决定&#xff0c;应用程序可以使用GDI函数改变设备对象的当前属性。本章介…

tar 的使用方法。

.tar解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName&#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09;---------------------------------------------.gz解压1&#xff1a;gunzip FileName.gz解压2&…

Wave文件的组织结构

操作Wave文件&#xff0c;先了解Wave文件的组织结构 WAVE文件由"块"组成。块的基本结构如下&#xff1a; ------------------------------ 偏移量 名称 字节数 类型 ------------------------------ 00 块标志 4 字符 04 块长度…

添加修改sa用户 授权的总结

1、更改登录方式为混合验证方式 操作步骤为&#xff1a; 1&#xff0e; 打开企业管理器&#xff0c;依次展开服务器组&#xff0c;用右键单击软件使用的服务器。 2&#xff0e; 在弹出的快捷菜单&#xff0c;执行“属性”命令&#xff0c;出现“SQL Server属性”对话框。 单击…

COM原理及应用

COM原理及应用----COM特性 2009-01-14 10:19:25| 分类&#xff1a;技术技巧 |字号 订阅 COM原理及应用----COM特性1、面向对象系统的三个最基本的特性 封装性、多态性、重用性。 2、COM特性的概述 COM对象的封装特性是很彻底的&#xff0c;所有的对象状态信息必须通…