25

我刚刚查看了维基百科关于带外数据的条目,据我了解,OOB 数据以某种方式被标记为更重要并被视为普通数据,但以单独的流传输,这让我深感困惑。

实际的问题是(除了“有人可以解释什么是 OOB 数据吗?”):

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

4

3 回答 3

32

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

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

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

很高兴知道 OOB 的存在以及它的工作原理,以防万一您确实需要它。但是除非你只是好奇,否则不要费心从里到外学习它。你可能永远不会使用它。

于 2009-02-26T15:48:36.153 回答
3

我想我在这个页面上找到了答案。简而言之:

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

于 2009-02-26T11:09:25.717 回答
0

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

于 2009-02-26T11:30:57.553 回答