套接字编程:如何处理带外数据

时间:2009-02-26 10:14:01

标签: sockets out-of-band

我只是查看了wikipedia's entry on out-of-band data,据我了解,OOB数据在某种程度上被标记为更重要并被视为普通数据,但是在单独的流中传输,这让我感到非常困惑。

实际问题是(除了“有人能解释一下OOB数据是什么吗?”):

我正在编写一个使用套接字并需要使用select()的unix应用程序,并且想知道如何处理exceptfds参数?我是否需要将所有套接字放入此参数并对此类事件做出反应?或者我只是忽略它们?

3 个答案:

答案 0 :(得分:23)

我知道您已经决定不需要处理OOB数据,但如果您关心OOB,请记住以下事项......

  • IPv4不会真正在单独的频道上或以不同的优先级发送OOB数据。它只是数据包上的一个标志。
  • OOB数据非常有限 - 1个字节!
  • OOB数据可以内联或单独接收,具体取决于套接字选项
  • 即使下一次读取不包含OOB数据,也可能发生“异常”信令OOB数据(发送方上的网络堆栈可能会标记任何已排队的数据,因此另一方将知道有OOB ASAP)。这通常是通过输入“排放”循环来处理的,在该循环中您丢弃数据,直到实际的OOB数据可用为止。

如果这看起来有点令人困惑和毫无价值,那是因为它主要是。 使用OOB的充分理由,但这种情况很少见。一个例子是FTP,其中用户可能处于大转移的中间但决定中止。中止作为OOB数据发送。此时,服务器和客户端只是吃掉任何进一步的“正常”数据,以排出仍在传输的任何内容。如果中止是与数据内联处理的,那么所有未完成的流量都必须被处理,只能被转储。

很高兴知道OOB存在以及它如何工作的基础知识,以防万一你需要它。但除非你只是好奇,否则不要在内外学习它。你可能从不使用它的机会很不错。

答案 1 :(得分:3)

我想我在this page找到了答案。简而言之:

如果我不是发送任何OOB数据,我不需要在接收端处理OOB数据。我原以为OOB数据可以由发件人的操作系统生成。

答案 2 :(得分:0)

即使 发送它,您也不需要在接收端处理它 - 除非您主动接收OOB数据,否则在所有情况下都会被忽略OOB数据。