zoukankan      html  css  js  c++  java
  • 网络IPC:套接字之带外数据

    带外数据(Out-of-band data)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输。即使传输队列已经有数据,带外数据先行传输TCP支持带外数据,但是UDP不支持。套接字接口对带外数据的支持,很大程度受TCP带外数据具体实现的影响。

    TCP将带外数据称为“紧急”数据(“urgent”data)。TCP仅支持一个字节的紧急数据,但是允许紧急数据在普通数据传递机制数据流之外传输为了产生紧急数据,在三个send函数中任何一个指定标志MSG_OOB。如果带MSG_OOB标志传输字节超过一个时,最后一个字节被看作紧急数据字节。

    如果安排发生套接字信号,当接收到紧急数据时,那么发送信号SIGURG。在http://www.cnblogs.com/nufangrensheng/p/3500350.htmlhttp://www.cnblogs.com/nufangrensheng/p/3558505.html中BSD异步I/O部分,可以看到在fcntl中使用F_SETOWN命令来设置一个套接字的所有权。如果fcntl中第三个参数为正值,那么指定了进程ID;如果为非-1的负值,那么(该负值的绝对值)代表了进程组ID。因此,通过调用以下函数,可以安排进程接收一个套接字信号。

    fcntl(sockfd, F_SETOWN, pid);

    F_GETOWN命令可以用来获得当前套接字所有权。对于F_SETOWN命令,一个负值代表一个进程组ID,一个正值代表进程ID。因此,调用

    owner = fcntl(sockfd, F_GETOWN, 0);

    返回值owner,如果owner为正值,则owner等于配置为接受套接字信号的进程ID;如果owner为负值,则其绝对值为接受套接字信号的进程组ID。

    TCP支持紧急标记(urgent mark)的概念:在普通数据流中紧急数据所在的位置。如果采用套接字选项SO_OOBINLINE,那么可以在普通数据中接收紧急数据。为帮助判断是否接收到紧急标记,可以使用函数sockatmark。

    #include <sys/socket.h>
    int sockatmark(int sockfd);
    返回值:若在标记出则返回1,若没有在标记出则返回0,出错则返回-1

    当带外数据出现在套接字读取队列时,select函数(http://www.cnblogs.com/nufangrensheng/p/3557584.html)会返回一个文件描述符并且拥有一个异常状态挂起。可以在普通数据流上接受紧急数据,或者在某个recv函数中采用MSG_OOB标志在其他队列数据之前接收紧急数据。TCP队列仅有一个字节的紧急数据,如果在接收当前的紧急数据字节之前又有新的紧急数据到来,那么当前的字节会被丢弃。

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    hnoi2013
    图片屏幕LibGdxGearJoint齿轮关节
    数据属性WEKA学习总结
    函数调用[置顶] C/C++在main函数之前和之后会做些什么
    系统控制2013北京照明展后记
    终端安装解决svn "cannot set LC_CTYPE locale"的问题
    系统服务器Fedora和Red Hat Enterprise Linux实用指南(第6版)(上、下册)( 入行必读的Linux圣经)
    文件数据库Android面试题(三)
    UML中的活动图
    UML模型
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3567692.html
Copyright © 2011-2022 走看看