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

sou*_*rge 21 sockets out-of-band

我只是查看了wikipedia关于带外数据的条目,据我所知,OOB数据在某种程度上被标记为更重要并被视为普通数据,但是在单独的流中传输,这让我感到非常困惑.

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

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

dwc*_*dwc 25

我知道你已经决定不需要处理OOB数据了,但如果你关心OOB ,注意以下事项......

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

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

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

  • 我发现这篇文章很有趣:http://www.serverframework.com/asynchronousevents/2011/10/out-of-band-data-and-overlapped-io.html (2认同)