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

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

带外数据的发送

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

带外数据的接收

有两种方式:

  • 使用信号
  • 使用[[select()|select]]

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

带外数据标志

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

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