C++ UDP套接字以一定频率破坏数据包

标签 c++ c sockets networking udp

我正在开发一个基于 UDP 的简单文件传输协议(protocol)。 为了确保数据包被正确发送,我正在对它们进行校验和。在接收的那一刻,损坏的数据包被丢弃。我首先在我的家庭网络中测试我的协议(protocol)。我已经看到它支持几 MB/s 的上传带宽到互联网,所以我希望它能在两台连接到同一 wifi 路由器的计算机上表现良好。

发生的事情是,当我达到每秒 10000 个数据包(数据包只有几个字节!)时,数据包开始出现大量(大约 40% 到 60%)损坏(校验和失败)。这个问题的原因可能是什么?非常感谢任何帮助!

最佳答案

UDP 是一种面向无连接的协议(protocol) - 意思是,您可以随时发送 UDP 数据包 - 如果有人在监听,他们就会收到数据包。如果他们不这样做,他们就不会。数据包一定会到达。

您不能像发送 TCP 那样发送 UDP 数据包。您必须单独处理每个数据包。例如,使用 socket/TCP,你可以写入任意多的数据,TCP 会把它拿到那里,除非你溢出了 socket 本身。这是可靠的。

UDP 不是。如果您发送 UDP 数据包并且它丢失了,它永远丢失并且没有办法恢复它 - 您必须自己在层上使用自己的协议(protocol)进行恢复。没有重新发送,这不是可靠的连接。

虽然有校验和,但它通常是可选的,通常不使用。

UDP 非常适合流式传输数据,例如音乐、语音等。在语音的 UDP 层之上有 RTP 等恢复协议(protocol),可以在语音编码器中恢复数据。

我敢打赌,如果您在 UDP 数据包中放置一个计数器,您会注意到,如果您超过某个带宽,其中一些不会到达,如果您通过交换机/网络连接,肯定会遇到这种情况。如果您在两台计算机之间进行直接连接,它可能会在非常高的带宽下工作。

关于C++ UDP套接字以一定频率破坏数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23506965/

相关文章:

c++ - X 请求失败错误 : GLXBadFBConfig

java - 如何通过 TCP 连接发送字节数组(java 编程)

c++ - QTcpSocket - 扩展 QRunnable 时指定了无效句柄

c++ - 我应该使用 std::remove 从列表中删除元素吗?

c++ - 插入 vector 后内存损坏

c++ - 初始化列表中的依赖关系

c - MJPEG 互联网流媒体 - 准确的 fps

c - 在c中打印前N个阶乘数的程序

c - 保持 Erlang 和 C 之间的定义同步

c++ - 创建 C++ FTP 服务器