【问题标题】:socket programming: How do I handle out of band data套接字编程:如何处理带外数据
【发布时间】:2009-02-26 10:14:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: sockets out-of-band


    【解决方案1】:

    我知道您已决定不需要处理 OOB 数据,但如果您确实关心 OOB...

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

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

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

    【讨论】:

    • 所以如果我做对了,OOB 数据的完美用途是在任何二进制流中——比如给出的文件传输示例,或音频/视频流等。
    • 二进制或文本,没关系。但是二进制文件确实往往更大,导致传输中的队列和数据包更满。当您想发出一些异常事件的信号并且不想处理任何已排队或正在传输的数据时,请使用 OOB。
    • 我觉得这篇文章很有趣:serverframework.com/asynchronousevents/2011/10/…
    【解决方案2】:

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

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

    【讨论】:

    • 是的,如果没有发送,您不需要处理它。
    • @soulmerge 需要解释更多吗?原来的链接现在失效了。
    • @soulmerge 感谢您的回复(太棒了,您可以在回答 10 年后得到回复!)我查看了页面并试图找到有关为什么不需要处理的信息OOB 如果它不发送 OOB。我肯定错过了什么。该页面似乎显示了服务器发送 OOB 而客户端接收 OOB 的示例?
    • @PengheGeng 因为默认情况下数据没有标记为OOB数据。如果您仍然感兴趣,请查看 APUE 第 16.7 章。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多