簡體   English   中英

NTP UDP套接字不接收任何數據,因此方法永遠不會返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM