アウト・オブ・バンド (OOB) データは、 コネクション型 (ストリーム) ソケットにのみ意味のあるユーザー固有のデータです。
ストリーム・データは、一般に送信された順序で受信されます。OOB データはストリーム内の位置に関係なく (および送信時の順序に関係なく) 受信されます。 これが可能なのは、データがプログラム A からプログラム B に送信される場合、 プログラム B にデータの到着を通知するようにマーク付けられているためです。
OOB データは、AF_INET (SOCK_STREAM) と AF_INET6 (SOCK_STREAM) でしかサポートされていません。
OOB データは、send()、sendto()、および sendmsg() API で MSG_OOB フラグを指定することにより送信されます。
OOB データの伝送は通常のデータの伝送と同じです。 バッファーに入れたデータの後に送信されます。 つまり、OOB データがバッファーに入れられるデータよりも優先されることはなく、 データは送信順に伝送されます。
受信側の環境はやや複雑になっています。
SIOCATMARK ioctl() 要求は、 読み取りポインターが最終 OOB バイトを指しているかどうかを決定します。
ソケット・オプションの SO_OOBINLINE が設定されておらず、 送信プログラムが 1 バイトを超えるサイズの OOB データを送信した場合は、 最終バイト以外のすべてのバイトは通常データであると見なされます。(通常データとは、受信プログラムが MSG_OOB フラグの指定なしで受信できるデータのことです。) 送信された OOB データの最終バイトは、通常データ・ストリームには保管されません。 このバイトを取得する唯一の方法は、 MSG_OOB フラグが設定されている recv()、recvmsg()、または recvfrom() API を発行するという方法です。 MSG_OOB フラグが設定されずに受信操作が発行され、通常データが受信された場合、OOB バイトは削除されます。また、OOB データの複数オカレンスが送信された場合、 先のオカレンスの OOB データは失われ、 最終 OOB データ・オカレンスの OOB データの位置が記憶されます。
ソケット・オプションの SO_OOBINLINE を設定すると、 送信されたすべての OOB データが通常データ・ストリームに保管されます。 データを取得するには、上記の 3 つの受信 API のうち 1 つを MSG_OOB フラグを設定せずに発行します (このフラグを指定すると、 エラー [EINVAL] が戻されます)。OOB データの複数オカレンスが送信される場合は、OOB データは失われません。