我正在开发 SNTP 客户端,它通过 UDP 从 NTP 服务器获取时间戳。一切正常,我可以下载时间戳并更新 Windows 时钟,但如果 UDP 数据包丢失,我想收到一条消息。如何检测数据包何时丢失?我需要该信息,因为如果数据丢失,我想获得新的时间戳。
... 我该如何测试该功能?如何故意丢失UDP数据包?
最佳答案
你有三个选择:
- 忽略丢包
- 改为使用 TCP
- 建立自己的检测系统
你问的是如何做#3,答案是:
- 为每个数据包添加数据包编号和数据包时间戳。
- 创建一个数据包堆栈并将传入的数据包插入到按数据包编号排序的堆栈中。
- 仅当存在包编号为(最后一个包编号 + 1)的包时才从堆栈中移除包。
- 如果数据包中存在间隙并且 (gap + 1) 数据包的时间戳大于某个阈值,则发送“重新传输请求”数据包以重新传输丢弃的数据包。
等一下.. 这正是 TCP 的工作原理 (*)!你应该只使用 TCP!
(*) 这是一种简化,TCP 做了大量工作来使过程可靠。
关于c# - 如何检测UDP数据包丢失? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157825/