我正在开发 SNTP 客户端,它通过 UDP 从 NTP 服务器获取时间戳。一切正常,我可以下载时间戳并更新 Windows 时钟,但如果 UDP 数据包丢失,我想收到一条消息。如何检测数据包何时丢失?我需要这些信息,因为如果数据丢失,我想获得新的时间戳。
...以及如何测试该功能?如何故意丢失UDP数据包?
你有三个选择:
您要问的是如何做#3,答案是:
等一下……这正是 TCP 的做法(*)!你应该只使用TCP!
(*) 这是一种简化,TCP 做了大量工作来使过程可靠。
这对于 UDP 是不可能的。如果您需要可靠的连接,您应该使用 TCP。
UDP 是一种无连接协议。当没有连接时,您无法“检测”任何东西。您必须使用面向连接的协议(例如 TCP)来解决此问题。
因为没有办法测试 UDP 是否无法到达,唯一真正的选择是在所有发送的数据前加上一个“数据包号”,所以如果它不是下一个数字,你就知道它丢失了一个数据包。
据我所知,没有办法故意丢失 1 个 udp 数据包,除了拉扯电缆并更换它.. 并希望..
好的。我知道了。但是我可以通过这样做来检查数据包丢失吗?例如,如果我将计时器设置为 2 秒,然后运行此函数,我可以查看服务器是否正确响应。那我应该知道有没有丢包?
public bool IsResponseValid()
{
if(SNTPData.Length < SNTPDataLength || Mode != _Mode.Server)
{
return false;
}
else
{
return true;
}
}