我有一项任务,必须使用 UDP 通过可靠和不可靠的网络在客户端和服务器之间发送消息。客户端向服务器发送消息,服务器读取该消息,将其存储在本地文件中,然后向客户端发送确认作为返回。通过可靠的网络,我的代码运行顺利,数据包永远不会丢失、重复或重新排序。
为了设置不可靠的网络,我的教授让我们在我们的终端中运行sudo tc qdisc add dev lo root netem delay 100ms 20ms 25% loss 0.5%重复1% reorder 25% 50%
为了创建一个模拟的不可靠网络。
我根本无法想出一种方法来防止我的数据包被复制或丢失。我没有发布任何代码,因为我不想让它看起来像是我在寻求答案。我试图了解其背后的方法,因为我在套接字或网络编程方面不是很有经验。有什么方法可以防止我的数据包在不可靠的网络上被复制或丢弃?
最佳答案
在这种情况下,您应该使用自定义协议(protocol),我可以想到这一点
首先,我们的数据包中应该有一个数字,可以帮助我们跟踪发送和接收的内容,我们将其称为 PacketId,
发送方发送带有其唯一 ID 的数据包,存储它并启动一个等待 ACK 的计时器,如果收到该特定 ID 的 ACK,则将从队列中删除它,然后发送下一个数据包,如果没有且计时器溢出,则发送该数据包再说一次,
关于 ID 的最后一件事是,每个数据包它都应加一。
在接收端,您只等待特定的 ID,假设一开始您正在等待 ID 0,接收到的任何其他数据包都将被忽略,直到检测到该特定 ID,然后将预期 ID 加一并继续转发。
可能存在 ACK 丢失并且服务器发回先前数据包的情况,因此即使这些数据包不是预期的,您也应该 ACK,并且确保不要两次处理这些数据包。
这是我想到的一个基本模式,它一次只发送一个数据包,稍加调整它就可以适应一次发送多个数据包并等待 ACK
关于c - 在C中如何防止UDP数据包被重复或丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53574212/