Skip to content

带外数据

果冻虾仁 edited this page Aug 22, 2017 · 3 revisions

带外数据即简称OOB(out-of-band)

带外数据是流式套接字独有的。当出现紧急情况时,无法立即通知接收进程。带外数据正用于解决这一问题。带外数据在正常的数据流之外发送,其效果相当于越过套接字上所有等待数据。当它到达接收进程时,接收进程会收到一个信号,从而进程可以立即处理这个数据。

带外数据的发送

比较简单,只需用MSG_OOB标志调用send()即可

带外数据的接收

有两种方式:

发送程序发送的每一个带外数据对接收程序都生成了一个SIGURG信号。接收者收到带外数据的时机是不确定的。

带外数据标志

带外数据如果没有设置**SO_OOBINLINE**选项,即没有**嵌入**到普通数据之中,那么在收到带外数据通知后直接调用recv()就能读带外数据。但如果设置了这个选项,使带外数据嵌入到了普通数据之中我们要怎么读带外数据呢?

流套接字在接收带外数据时会自动放置一标志于正常数据流中。这个标志指出带外数据发送时原来所在的位置。带外数据标志用来区分哪些数据位于带外数据之前,哪些数据位于带外数据之后。
需要用sockatmark()来读带外数据

Linux环境编程API

C语言API包含部分标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。

头文件源码

大部分头文件源码在/usr/include目录下。

安装man手册

因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。

Ubuntu

apt-get install manpages-posix        
apt-get install manpages-posix-dev

默认安装了manpages-dev,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn函数。

CentOS

yum install man-pages.noarch

关于目录

左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。

Clone this wiki locally