首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NTP UDP套接字没有接收到任何数据,因此方法永远不会返回。

NTP UDP套接字没有接收到任何数据,因此方法永远不会返回。
EN

Stack Overflow用户
提问于 2013-10-28 17:31:54
回答 1查看 505关注 0票数 0

在C#:https://stackoverflow.com/a/12150289/559988中,我使用了将NTP时间作为一个https://stackoverflow.com/a/12150289/559988对象返回的实现

然而,由于这是部署在软件上的许多计算机上的网络,我不控制,问题是,有时NTP有时会被阻止在这些网络。因此,当调用该方法时,它似乎永远不会返回,因为它永远得不到任何数据。

我试图按以下方式实现超时:

代码语言:javascript
复制
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协议(我认为)会导致套接字打开,但是挂起连接或等待接收数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-28 18:32:04

我相信您实现的超时不起作用,因为方法总是会立即返回。

UDP协议是无连接的。当您在UDP套接字上调用Connect()时,实际上什么都没有发生,您只是设置了一个默认端点,这样就不会在每个Send()调用上重复自己了。

即使远程主机无法访问,Send()调用也会很快返回。在这种情况下,数据将丢失,这就是UDP的工作方式。

底线:,您需要在Receive()调用上实现超时:

代码语言:javascript
复制
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");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19641304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档