分类: 系统运维
2012-04-03 09:58:44
频道外数据是一个由一些通信协议支持的可选特性,允许分发的数据有比通常更高的优先级。频道外数据在任何已经排队的数据之前发送。TCP支持频道外数据,但是UDP不支持。频道外数据的套接字接口被TCP的频道外数据深深地影响。
TCP 把频道外数据引用为“紧急”数据。TCP只支持单个字节的紧急数据,但是允许紧急数据从普通数据分发机制分发到频道外。为了产生紧急数据,我们为三个 send函数中的任何一个指定MSG_OOB标志。如果我们用MSG_OOB标志发送多于一个字节的数据,那么后面一个字节被视为紧急数据字节。
当 紧急数据被接收时,我们被发送SIGURG信号,如果我们已经为套接字产生的信号布署好了。在3.14节和14.6.2节,我们看到了我们可以在 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已配置的从套接字接收信号的进程ID(正值),或绝对值为进程组ID(负值)。
TCP支持一个urgent mark的记法:在普通数据流里紧急数据可以去的点。我们可以选择把紧急数据内嵌到普通数据里来接收,如果我们使用SO_OOBINLINE套接字选项。为了帮助我们标识我们何时到达了紧急标记,我们可以用sockatmark函数。
当下一个要读的字节是紧急标记放置的地方时,sockatmark将返回1。
当 频道外的数据出现在一个套接字的读队列时,select函数(14.5.1节)会返回文件描述符作为有一个待定的例外条件。我们可以选择把紧急数据内嵌在 普通数据里,或者我们使用MSG_OOB标志让某个recv函数在任何其它队列数据之前接收这个紧急数据。TCP只排队一个字节的数据。如果另一个紧急字 节到达在我们接收当前这个之前到达,那么已有的这个会被舍弃。