是指连接双方中的一方发生重要事情,想要迅速地通知对方。
这种通知在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。
带外数据设计为比普通数据有更高的优先级。
带外数据是映射到现有的连接中的,而不是在客户机和服务器间再用一个连接。
在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读或写任意数量的字节。为保证传输正确或采用有流控制的协议时,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。 在数据传送过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息,如UNIX系统的中断键(Delete或Control-c)、终端流控制符(Control-s和Control-q),称为带外数据。逻辑上看,好象用户进程使用了一个独立的通道传输这些数据。该通道与每对连接的流相联系。由于Berkeley Software Distribution中对带外数据的实现与RFC 1122中规定的Host Agreement 不一致,为了将互操作中的问题减到最小,应用程序编写者除非与现有服务互操作时要求带外数据外,最好不使用它。
对带外数据的实现一般使用BSD的紧急数据指针方式,即TCP只保证将紧急数据之前的所有数据一起返回给应用程序,而应用程序怎样处理这个事件完全由自己决定,甚至可以认为是一般的数据而不加以特别对待,所以对于一些设计不太合理的程序,比如根本不判断read的返回值之类的,反而根本不会受到OOB的影响。
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct
timeval *timeout);
maxfdp1 : 描述字最大值
readset : 读描述字集
writeset : 写描述字集
exceptset : 异常条件的描述字集
timeout : 等待时间
readset, writeset和exceptset:让内核测试读、写和异常条件所需的描述字。
为这三个参数的每一个指定一个或多个描述字集。
其中,exceptset异常条件待处理
如果一个套接口存在带外数据或者仍处于带外标记,那它有异常条件待处理。
带外数据只能用于流套接口,它是利用了tcp字段中的紧急数据字段来实现的。
按上面的方法可以进行带外数据的接收,在检测到有异常条件时使用recv(..., MSG_OOB)来进行数据
接收。
发送带外数据可以这样:
send(sclient, buf, 1, MSG_OOB);//带外数据通常就一个字符
来源:
http://blog.163.com/clevertanglei900@126/blog/static/111352259201122142545411/
http://blog.chinaunix.net/uid-20437338-id-1946334.html