我有一个网络软件,它使用UDP与同一程序的其他实例通信。由于不同的原因,我必须在这里使用UDP。
最近,我在通过UDP发送大量数据时遇到了问题,不得不实现分段系统将我的消息分成小数据块。到目前为止,它运行良好,但是当我必须发送大量数据块时,我现在遇到了问题。
我有以下算法:
1. 将消息分成小数据块(约1500字节) 2. 遍历数据块列表,并为每个块使用
然而,当我发送大量数据块时,接收方仅收到前6条消息。有时会错过第六条并接收第七条。这取决于情况。
无论如何,
如果我在
我知道UDP允许数据包丢失,我的帧可能因为很多原因而丢失,我想这与我以某种速率发送数据块有关。
这里应该采取什么正确的方法?
1. 实现一些确认机制(就像TCP)似乎过于繁琐。 2. 在
我真的需要你的建议。
非常感谢。
附加信息如请求所示
我必须使用UDP的原因是因为我有几个限制:
1. TCP在NAT穿透方面工作不好(至少没有特定的配置) 2. 有些消息可能丢失。其他一些则不能。 3. 消息传递顺序无关紧要。
最近,我在通过UDP发送大量数据时遇到了问题,不得不实现分段系统将我的消息分成小数据块。到目前为止,它运行良好,但是当我必须发送大量数据块时,我现在遇到了问题。
我有以下算法:
1. 将消息分成小数据块(约1500字节) 2. 遍历数据块列表,并为每个块使用
sendto()
发送然而,当我发送大量数据块时,接收方仅收到前6条消息。有时会错过第六条并接收第七条。这取决于情况。
无论如何,
sendto()
总是表示成功。当我在回环接口(127.0.0.1)上测试我的软件时,这总是发生,但从未在我的局域网上发生。如果我在
sendto()
之间添加类似于std::cout << "test" << std::endl;
的内容,则每个帧都会被接收。我知道UDP允许数据包丢失,我的帧可能因为很多原因而丢失,我想这与我以某种速率发送数据块有关。
这里应该采取什么正确的方法?
1. 实现一些确认机制(就像TCP)似乎过于繁琐。 2. 在
sendto()
之间添加任意等待时间很丑陋,可能会降低性能。
3. 增加(如果可能)接收器UDP内部缓冲区?我甚至不知道这是否可能。
4. 其他方法?我真的需要你的建议。
非常感谢。
附加信息如请求所示
我必须使用UDP的原因是因为我有几个限制:
1. TCP在NAT穿透方面工作不好(至少没有特定的配置) 2. 有些消息可能丢失。其他一些则不能。 3. 消息传递顺序无关紧要。