c - 在C中如何防止UDP数据包被重复或丢弃?

标签 c udp

我有一项任务,必须使用 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/

相关文章:

c - 一次读取两个文件一个字节

c - Linux 系统调用中 fcntl 中 F_DUPFD 的用法是什么

go - 缓冲阅读器 VS listenUDP

c - 最好有一个长的或多个短的 UDP 套接字?

sockets - 返回的 UDP 数据包缺少端口且无法到达

c - printf 导致 getlogin() 出现段错误

c - libwnck 中的内存泄漏

c - 在 Minix 中添加新的系统调用

c - UDP套接字池会不会提高数据报传递的成功率和效率?

Java - 仅在本地主机上工作的 UDP 多播