我正在開發通過UDP從NTP服務器獲取時間戳的SNTP客戶端。一切正常,我可以下載時間戳和更新Windows時鐘,但是如果UDP數據包丟失了,我希望得到一條消息。如何檢測包何時丟失?我需要這些信息,因爲如果數據丟失,我想獲得新的時間戳。如何檢測UDP數據包已丟失? (C#)
...以及如何測試該功能?如何故意丟失UDP數據包?
我正在開發通過UDP從NTP服務器獲取時間戳的SNTP客戶端。一切正常,我可以下載時間戳和更新Windows時鐘,但是如果UDP數據包丟失了,我希望得到一條消息。如何檢測包何時丟失?我需要這些信息,因爲如果數據丟失,我想獲得新的時間戳。如何檢測UDP數據包已丟失? (C#)
...以及如何測試該功能?如何故意丟失UDP數據包?
這是UDP無法實現的。如果你需要一個可靠的連接,你應該使用TCP。
+1,儘管您仍然可以實現與序列號的連接,通過UDP進行確認和重新傳輸。儘管這沒有意義,但我必須將其作爲實驗任務來完成(許多小時和測試幾乎與TCP一樣好,這是真正的痛苦)。 – NotGaeL
UDP是無連接協議。當沒有連接時,你無法「檢測」任何東西。您必須使用面向連接的協議(如TCP)才能解決此問題。
好的。我知道了。但是我可以通過做這樣的事情來檢查丟包情況嗎?例如,如果我將計時器設置爲2秒,然後運行此功能,我可以看到服務器是否正確響應。那我應該知道是否有包丟失?
public bool IsResponseValid()
{
if(SNTPData.Length < SNTPDataLength || Mode != _Mode.Server)
{
return false;
}
else
{
return true;
}
}
無法抗拒優化代碼的衝動: return SNTPData.Length> = SNTPDataLength && Mode == _Mode.Server; – rmp251
你有三個選擇:
什麼你問是怎麼做的#3,答案是:
擱置一秒..這就是TCP的確如此(*)!你應該只使用TCP!
(*),這是一種簡化,TCP不工作的很大,使這一進程可靠。
因爲沒有辦法測試,如果UDP沒有到達,唯一真正的選擇是前面加上「包號」和發送的所有數據,因此如果它不符合下一個號碼,你知道它失去了包..
據我所知,有沒有辦法故意輸掉1個UDP數據包時,除了猛拉電纜和更換..和希望..
UDP是單向的,你可以沒有檢測到包丟失。這是TCP和UDP之間的主要區別。 –
這個服務究竟是如何工作的?請問您的客戶端向服務器的請求,並等待響應,之後更新它的時間?或者您的客戶端是否等待並偵聽來自服務器的UDP數據包?無論哪種方式,您都無法真正驗證UDP數據包的傳輸。根據您的需求,設置超時可能對您來說可能是更好的選擇?如果在最近的X秒內沒有更新時間或者類似的東西,顯示警告或拋出異常或其他內容? – Kjartan