带外(00B)数据

来源:互联网 发布:淘宝该用户已被冻结 编辑:程序博客网 时间:2024/06/04 18:49

 带外(00B)数据是特定于用户的数据,仅对面向连接的(流)套接字有意义。流数据通常是按发送次序接收的。OOB 数据的接收与它在流中的位置无关(与发送它的次序无关)。这是有可能的,原因是数据是按以下方式标记的,在将数据从程序 A 发送至程序 B 时,会通知程序 B 数据到达。

  OOB 数据仅在 AF_INET(SOCK_STREAM)和 AF_INET6(SOCK_STREAM)上受支持。
  通过在 send()、sendto() 和 sendmsg() 函数上指定 MSG_OOB 标志来发送 OOB 数据。
  传送 OOB 数据与传送常规数据一样。它是在所有缓冲数据之后发送的。换句话说,OOB 数据的优先级别没有可能缓冲的任何数据的优先级别高;数据是按其发送次序传送的。
  在接收端,事情有一点复杂:
  ●套接字 API 通过使用 OOB 标记程序了解在系统上接收到的 OOB 数据。OOB 标记程序指向发送的 OOB 数据中的最后一个字节。(注意:指示 OOB 标记程序指向哪个字节的值是在系统基础上设置的。此值在 TCP 连接的本地和远程端必须一致。使用此值的套接字应用程序在使用它时必须在客户机和服务器应用程序之间保持一致。)
  SIOCATMARK ioctl() 请求确定读指针是否正指向最后一个 OOB 字节。(注意:如果发送多次出现的 OOB 数据,则 OOB 标记程序指向最后一次 OOB 数据出现的最后一个 OOB 字节。)
  ●无论 OOB 数据是否以直接插入方式接收,输入操作会一直处理数据直至遇到 OOB 标记程序(如果发送了 OOB 数据的话)。
  ●recv()、recvmsg() 或 recvfrom() 函数(设置有 MSG_OOB 标志)用于接收 OOB 数据。如果其中一个接收函数完成并发生下列情况之一,会返回错误 [EINVAL]。
  1、未设置套接字选项 SO_OOBINLINE,也没有 OOB 数据可接收。
  2、设置了套接字选项 SO_OOBINLINE。
  如果未设置套接字选项 SO_OOBINLINE,且发送程序发送的 OOB 数据的大小超过 1 字节,则除最后一个字节之外的所有字节都被视作普通数据。(普通数据表示接收程序可接收数据而不指定 MSG_OOB 标志。)发送的 OOB 数据的最后一个字节未存储在普通数据流中。只能发出 recv()、recvmsg() 或 recvfrom() 函数(设置有 MSG_OOB 标志)来检索此字节。如果未设置 MSG_OOB 标志而发出接收,将检索普通数据,OOB 字节将被删除。而且,如果发送多次出现的 OOB 数据,则先前出现的 OOB 数据将会丢失,仅记住最后一次 OOB 数据出现的 OOB 数据位置。
  如果设置了套接字选项 SO_OOBINLINE,则发送的所有 OOB 数据都存储在普通数据流中。可通过发出下列三个接收函数之一而不指定 MSG_OOB 标志(如果指定它的话,将返回错误 [EINVAL])来检索数据。如果发送多次出现的 OOB 数据,OOB 数据不会丢失。
  ●如果未设置 SO_OOBINLINE 且已接收到 OOB 数据,则不会废弃 OOB 数据,用户会将 SO_OOBINLINE 设置为开。初始 OOB 字节被视作普通数据。
  ●如果未设置 SO_OOBINLINE 且已发送 OOB 数据,同时接收程序发出了输入函数以接收 OOB 数据,则 OOB 标记程序仍然有效。接收程序仍然可以检查读指针是否在 OOB 标记程序上,即使接收到 OOB 字节。
原创粉丝点击