out-of-band data 带外数据

来源:互联网 发布:电磁炉和电陶炉 知乎 编辑:程序博客网 时间:2024/06/07 01:55
 带外数据(out—of—band   data),有时也称为加速数据(expedited   data),   
  是指连接双方中的一方发生重要事情,想要迅速地通知对方。   
  这种通知在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。   
  带外数据设计为比普通数据有更高的优先级。   
  带外数据是映射到现有的连接中的,而不是在客户机和服务器间再用一个连接。   

  

在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读或写任意数量的字节。为保证传输正确或采用有流控制的协议时,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。   在数据传送过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息,如UNIX系统的中断键(Delete或Control-c)、终端流控制符(Control-s和Control-q),称为带外数据。逻辑上看,好象用户进程使用了一个独立的通道传输这些数据。该通道与每对连接的流相联系。由于Berkeley   Software   Distribution中对带外数据的实现与RFC   1122中规定的Host   Agreement   不一致,为了将互操作中的问题减到最小,应用程序编写者除非与现有服务互操作时要求带外数据外,最好不使用它。


对带外数据的实现一般使用BSD的紧急数据指针方式,即TCP只保证将紧急数据之前的所有数据一起返回给应用程序,而应用程序怎样处理这个事件完全由自己决定,甚至可以认为是一般的数据而不加以特别对待,所以对于一些设计不太合理的程序,比如根本不判断read的返回值之类的,反而根本不会受到OOB的影响。 


  Socket编程,select   函数   
  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

0 0
原创粉丝点击