[英]NTP UDP Socket Receives no data so method never returns
我在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協議(我認為)導致套接字打開但掛在任一連接上或等待接收數據。
我相信你實現的超時不起作用,因為該方法總是立即返回。
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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.