如何检测UDP数据包丢失?(C#) [英] How to detect that UDP packet has been lost? (C#)
问题描述
我正在开发SNTP客户端,该客户端通过UDP从NTP服务器获取时间戳.一切正常,我可以下载时间戳并更新Windows时钟,但是如果UDP数据包丢失,我想得到一条消息.如何检测数据包何时丢失?我需要这些信息,因为如果数据丢失,我想获得新的时间戳.
I am developing SNTP client which gets time stamp from NTP server via UDP. Everything works fine, I can download time stamp and update windows clock, but I'd like to get a message if UDP packet has been lost. How can I detect when packet has been lost? I need that information, because I want to get new time stamp if data lost.
...以及如何测试该功能?如何故意丢失UDP数据包?
... and how can I test that feature? How can I lost UDP packet purposely?
推荐答案
您有三个选择:
- 忽略丢弃的数据包
- 改为使用TCP
- 构建自己的检测系统
您要问的是如何做#3,答案是:
What you're asking is how to do #3 and the answer is:
- 为每个数据包添加一个数据包编号和一个时间戳记.
- 创建一个数据包堆栈,并将传入的数据包按堆栈编号插入到堆栈中.
- 仅当存在一个包号为(最后一个包号+ 1)的包时,才从堆栈中删除包.
- 如果数据包中有间隙并且(gap + 1)数据包的时间戳大于某个阈值,请发送重新传输请求"数据包以使丢弃的数据包重新传输.
稍等片刻..这正是TCP的工作方式(*)!您应该只使用TCP!
Hold on a second.. that's exactly how TCP does it(*)! You should just use TCP!
(*)这是一个简化,TCP为了使过程可靠而做了很多工作.
(*) That was a simplification, TCP does a great deal of work to make the process reliable.
这篇关于如何检测UDP数据包丢失?(C#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!