【问题标题】:C++ Lost UDP packets that in real they are delayedC ++丢失的UDP数据包实际上是延迟的
【发布时间】:2018-01-08 11:26:41
【问题描述】:

我有一个 UDP 连接,它将一个回显服务器与一个测试客户端连接起来。测试客户端连续发送数据包并等待大约一秒钟以接收它们。 如果它无法获取数据包,则假定数据包丢失并发送另一个数据包。 大多数数据包已成功发送和接收,但其中一些假设丢失的数据包将在发送下一个数据包后在客户端接收。实际上他们收到延迟。 我的发送和接收功能在不同的线程上运行。 我能做些什么来消除这些延迟的数据包? (我的程序在我的本地主机上运行——所以丢包是不合理的)

【问题讨论】:

  • 只选择一种语言,UDP 是 UDP,如果您需要更多功能,请寻找另一种协议,如 TCP。
  • 序列号。如果您收到的回复包的序列号低于您发送的最后一个,则忽略它。
  • 如果您正在处理 UDP,您应该为数据包丢失、重新排序和重复做好准备。 “我的发送和接收功能在不同的线程上运行”这句话让我认为这实际上是您的应用程序中的多线程问题,而不是数据包丢失(这确实不太可能在 localhost 上发生)。
  • 似乎序列号较低的数据包到达得更快,@Someprogrammerdude
  • 你这是什么意思?假设您发送数据包 #1 并得到回复。然后您发送数据包 #2,但回复延迟。因此,您继续发送数据包#3,但在收到它的回复之前,您会收到#2 的回复。然后忽略#2,继续等待#3。等等。如果您在发送 #3 之前收到 #2,那么一切都很好。

标签: c++ sockets udp pthreads


【解决方案1】:

您很可能无法防止包延迟(可能是由于网络接口、内核、应用程序堆栈中的缓冲区)。 UDP 是不可靠的,如果您需要确保每个包都已交付,则通常应使用 TCP。否则会有一些选项,比如使用序列号或更复杂的协议实现来确保你没有乱序(比如每个包的确认)。

不过,您所描述的听起来更像是使用 TCP。

【讨论】:

    【解决方案2】:

    谢谢大家。

    receive中select的延迟应该小于main中等待接收线程包的时间

    【讨论】:

      【解决方案3】:

      如果网络拥塞或启用了代理/防火墙,就会发生这种情况。 检查网络信号强度。 如果在您的本地网络中启用了任何防火墙设置,请删除。 切换到路由器中具有良好强度的最佳频道。

      【讨论】:

      • my program is running on my localhost 不太可能是代理或防火墙问题。更糟糕的是,尝试修复无线通道最多只能隐藏问题而不是解决问题。
      • 由于 UDP 不可靠,丢包是最常见的问题。因此,您可以做几件事,以确保收到所有数据包,在发送数据包后等待来自客户端的确认,然后发送下一个数据包。如果客户端在某个时间间隔内没有确认,则再次重新传输相同的数据包。这样至少可以确保所有数据包成功传递,但会降低性能。第二种方式不要频繁发送数据,而是将其放入缓冲区和传输缓冲区。
      • As UDP is unreliable, packet drop is most common issue. not 在本地机器上使用时不是。即使是这样,如果应用程序无法处理丢包,那也是要解决的问题;没有试图改善丢包率。
      • If client is not acknowledging in certain interval re-transmit the same packet again. 这叫 TCP。
      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2023-03-30
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2010-10-11
      相关资源
      最近更新 更多