我有一个网络软件,它使用 UDP 与同一程序的其他实例进行通信。由于不同的原因,我必须在这里使用 UDP。
我最近在通过 UDP 发送大量数据时遇到了问题,我不得不实现一个分片系统来将我的消息分成小数据块。到目前为止,它运行良好,但是当我必须发送大量数据块时,我现在遇到了一个问题。
我有以下算法:
- 将消息拆分成小数据块(大约 1500 字节)
- 遍历数据块列表,并为每一个,使用发送它
sendto()
但是,当我发送大量数据块时,接收方只收到前 6 条消息。有时它会错过第六个而收到第七个。这取决于。
不管怎样,sendto()
总是预示着成功。当我通过环回接口 (127.0.0.1) 测试我的软件但从未通过我的 LAN 网络测试我的软件时,总是会发生这种情况。
std::cout << "test" << std::endl;
如果我在之间添加类似的东西,sendto()
那么每一帧都会被接收到。
我知道 UDP 允许数据包丢失,并且我的帧可能由于很多原因而丢失,我想这与我发送数据块的速率有关。
这里的正确方法是什么?
- 实现一些确认机制(就像 TCP 一样)似乎有点过头了。
- 在两者之间添加一些任意等待时间
sendto()
是丑陋的,并且可能会降低性能。 - 增加(如果可能的话)接收方 UDP 内部缓冲区?我什至不知道这是否可能。
- 还有什么?
我在这里真的需要你的建议。
非常感谢。
应要求提供的附加信息
我必须使用 UDP 的原因是因为我有几个限制:
- TCP 不能很好地与 NAT 遍历一起工作(至少在没有特定配置的情况下)
- 有些消息可能会丢失。有些人不能。
- 消息传递顺序无关紧要。