如何检测UDP数据包丢失? (C#)

时间:2012-08-28 10:58:19

标签: c# udpclient ntp

我正在开发SNTP客户端,它通过UDP从NTP服务器获取时间戳。一切正常,我可以下载时间戳和更新Windows时钟,但如果UDP数据包丢失,我想收到一条消息。如何检测数据包何时丢失?我需要这些信息,因为如果数据丢失,我想获得新的时间戳。

......我该如何测试该功能?如何故意丢失UDP数据包?

5 个答案:

答案 0 :(得分:8)

使用UDP是不可能的。如果需要可靠的连接,则应使用TCP。

答案 1 :(得分:8)

您有三种选择:

  1. 忽略丢弃的数据包
  2. 使用TCP代替
  3. 建立自己的检测系统
  4. 你要问的是如何做#3,答案是:

    • 为每个数据包添加数据包编号和数据包时间戳。
    • 创建数据包堆栈,并按数据包编号将传入的数据包插入堆栈。
    • 仅当数据包编号为(最后一个数据包编号为+1)的数据包时,才从堆栈中删除数据包。
    • 如果数据包中存在间隙且(gap + 1)数据包的时间戳大于某个阈值,则发送"重新发送请求"数据包重新传输丢弃的数据包。

    等一下......那就是TCP的确如此(*)!你应该只使用TCP!

    (*)这是一个简化,TCP做了很多工作来使这个过程可靠。

答案 2 :(得分:1)

UDP是一种无连接协议。当没有连接时,你无法“检测”任何东西。您必须使用面向连接的协议(如TCP)才能解决此问题。

Comparison

答案 3 :(得分:0)

确定。我知道了。但是我可以通过做这样的事情来检查丢包吗?例如,如果我将计时器设置为2秒,然后运行此功能,我可以看到服务器是否正确响应。然后我应该知道是否有丢包?

public bool IsResponseValid()
    {
        if(SNTPData.Length < SNTPDataLength || Mode != _Mode.Server)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

答案 4 :(得分:0)

因为没有办法测试UDP是否未能到达,唯一真正的选择是为所有发送的数据添加“数据包号”前缀,因此如果它不是下一个数字,你知道丢失了一个数据包..

据我所知,除了拉扯电缆并更换它之外,没有办法故意丢失1 udp数据包..并希望...