我在 C# 中使用这种将 NTP 时间作为 DateTime 对象返回的实现: https ://stackoverflow.com/a/12150289/559988
然而,由于这部署在我无法控制的网络上的许多计算机上的软件中,问题就变成了有时 NTP 有时会在这些网络上被阻止。因此,当调用该方法时,它似乎永远不会返回,因为它永远不会返回任何数据。
我尝试按如下方式实现超时:
IAsyncResult result = socket.BeginConnect(ipEndPoint, null, null);
Boolean success = result.AsyncWaitHandle.WaitOne(15000,true);
if (!success)
{
socket.Close();
throw new ApplicationException("Failed to connect to NTP server within 15 seconds");
}
但是超时不起作用,因为该方法没有返回。
有谁知道我如何为 Socket 实现超时,以便我至少可以故障转移到另一种检查 NTP 时间的方法?
谢谢
编辑:只是为了澄清是否没有网络连接(即您禁用适配器)它会立即失败。这是一个网络问题,其中一些网络阻塞了 NTP 协议(我认为)导致套接字打开但挂在连接上或等待接收数据。