【问题标题】:C++ UDP sockets packet queuingC ++ UDP套接字数据包排队
【发布时间】:2010-10-15 21:49:59
【问题描述】:

我使用相同的 UDP 套接字来发送和接收数据。我想知道 DGRAM 套接字的数据包队列是否已经存在,或者我们是否必须单独处理它。

如果用户代码必须处理排队,它是如何完成的?我们是否有单独的线程来接收套接字并将数据包放入接收队列并从另一个发送队列发送到?

示例代码绝对很棒。感谢您的帮助。

【问题讨论】:

标签: c++ sockets udp queue packet


【解决方案1】:

有一个数据包队列。然而,当数据包队列被填满时,UDP 数据包开始被丢弃。当它们被丢弃时,它们将永远丢失,因此请确保您继续读取数据!

【讨论】:

  • +1:请注意,即使您的阅读速度足够快,也不能保证 UDP 帧(以正确的顺序或“完全”)到达,因此请为数据丢失做好准备。
【解决方案2】:

正如 Goz 所说,有一个数据包队列。实际上,在您的应用程序结束的整个管道的各个位置都有不止一个。 NIC 上通常有一些缓冲区,然后有一些由内核管理。内核缓冲区的大小通常可以使用 setsockopt() 为单个套接字调整大小。

正如 Goz 已经指出的那样,UDP 数据包在发送给您的途中可能会丢失,或者它们可能以不同的顺序到达。如果您需要可靠性和排序,并且如果您不能使用 TCP,则必须实现某种协议,该协议将在 UDP 之上同时提供这两种协议,例如sliding window protocol.

【讨论】:

    【解决方案3】:

    使用 UDP 实际上只有 接收套接字缓冲区。虽然有SO_SNDBUF 套接字选项,但提供的值只是数据报大小的上限。出站数据报要么整体提供给硬件,要么以片段的形式提供(如果它比 MTU 大),要么被丢弃。硬件通常有一些环形缓冲区,但这确实与 DMA 有关,与用户级应用无关。

    在应用程序中,最直接的数据包排队技术是circular buffer - 使其足够大以供正常使用,在高峰期丢失一些数据包。当然还有其他方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2020-11-29
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多