c++ - 通过 UDP 丢帧

标签 c++ qt networking udp router

这是我的第一个“问题”,我希望我做对了:)

我正在尝试网络编程,特别是我想通过无线网络使用 UDP 从一台机器向其他 >10 台设备广播数据。数据以大约 300 字节的数据包的形式出现,每秒大约 30 帧,即每 ~33 毫秒一个。 我的实现基于 qt 示例:http://qt-project.org/doc/qt-4.8/network-broadcastreceiver.html

我正在仅使用一个客户端测试该应用程序并遇到不少丢帧,我不太确定为什么。如果我使用以太网电缆,一切正常。我希望这里有人能帮我找到原因。

我可以发现丢失的帧,因为数据包包含一个时间戳:在我收到一个数据报后,我可以检查它的时间戳和最后一个收到的时间戳之间的差异,如果它大于例如50ms,表示我在途中丢失了一个数据包。 这种情况经常发生,即使我有一个专用的 wi-fi 网络(没有连接到互联网并且只有 3 台机器连接到我刚买的路由器)。大多数时候我会丢弃一两个数据包,这不是问题,但有时时间戳之间的差异表明丢失了超过 30 个数据包,这对我想要实现的目标不利。

当我从一台机器 ping 到另一台机器时,我得到这些值:

50 packets transmitted, 50 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.244/91.405/508.959/119.074 ms 

在只有 3 个客户端的专用网络中,对于新路由器来说相当糟糕,不是吗?该路由器被宣传为非常快速的 Wi-Fi 路由器,性能比 802.11n 路由器快三倍。

将它与我在同一个房间里连接了大约 10 台机器的旧路由器在办公时间内获得的值进行比较:

39 packets transmitted, 39 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.458/47.297/142.201/37.186 ms 

也许是路由器有问题?

我无法解释的一件事是,如果我在运行 UDP 客户端/服务器应用程序时执行 ping 操作,统计数据会提高:

55 packets transmitted, 55 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.164/6.174/197.962/26.181 ms 

我想知道是否有人有关于测试内容的提示,关于如何通过 wi-fi 在这些机器之间实现“可靠”UDP 连接的提示。可靠的意思是我可以丢弃 2 个连续的数据包,但不能更多。

谢谢。

编辑

路由器(?)似乎以突发方式发送数据包。我正在测量它在客户端接收两个数据报之间耗时,这个值对于大约 10 个数据包的序列大约是 3 毫秒,然后,对于下一个数据包大约是 300 毫秒。我认为我在客户端的问题更多地与帧之间的间隔不一致有关,而不是丢帧。我可能只需要有一个队列和 >300 毫秒的延迟到服务器。

最佳答案

解决与网络相关的任何问题的第一个也是最简单的方法是在 wireshark 上捕获它们。 还要检查数据包是否真的从广播机发出。

此外,根据您的描述,如果数据包可以通过以太网电缆正常传输,而不是 UDP,那么 UDP 端口也可能有问题。

关于c++ - 通过 UDP 丢帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25645232/

相关文章:

c++ - 使用数据流将 char 复制到 QbyteArray 包含一些额外的字节

image - Qt jpeg 无法在我 friend 的电脑上运行

C++11 可变大小 POD 结构

C++ 将 const char* 复制到 char*

c++ - 分支覆盖率低,尤其是在使用第 3 方库时。前 boost

linux - Qt Hello World 教程不起作用

networking - aws 实例不允许端口 80 进入我的机器

java - 一个很好的网络数学 Java 库

r - 如何根据边缘值选择网络对象中的节点?

c++ - 将大矩阵/数组转换为 Armadillo 矩阵