在C#:https://stackoverflow.com/a/12150289/559988中,我使用了将NTP时间作为一个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");
}但是超时不起作用,因为方法不返回。
有人知道我如何为套接字实现超时,以便至少可以失败到另一种检查NTP时间的方法上吗?
谢谢
编辑:只是为了澄清是否有网络连接(即。你禁用你的适配器)它马上就失败了,非常好。这是一个网络问题,一些网络阻塞了NTP协议(我认为)会导致套接字打开,但是挂起连接或等待接收数据。
发布于 2013-10-28 18:32:04
我相信您实现的超时不起作用,因为方法总是会立即返回。
UDP协议是无连接的。当您在UDP套接字上调用Connect()时,实际上什么都没有发生,您只是设置了一个默认端点,这样就不会在每个Send()调用上重复自己了。
即使远程主机无法访问,Send()调用也会很快返回。在这种情况下,数据将丢失,这就是UDP的工作方式。
底线:,您需要在Receive()调用上实现超时:
var result = socket.BeginReceive(ntpData, 0, ntpData.Length, SocketFlags.None, null, null);
var success = result.AsyncWaitHandle.WaitOne(15000);
if (!success)
{
socket.Close();
throw new ApplicationException("Failed to connect to NTP server within 15 seconds");
}https://stackoverflow.com/questions/19641304
复制相似问题