2012-08-28 75 views
1

我正在開發通過UDP從NTP服務器獲取時間戳的SNTP客戶端。一切正常,我可以下載時間戳和更新Windows時鐘,但是如果UDP數據包丟失了,我希望得到一條消息。如何檢測包何時丟失?我需要這些信息,因爲如果數據丟失,我想獲得新的時間戳。如何檢測UDP數據包已丟失? (C#)

...以及如何測試該功能?如何故意丟失UDP數據包?

+4

UDP是單向的,你可以沒有檢測到包丟失。這是TCP和UDP之間的主要區別。 –

+0

這個服務究竟是如何工作的?請問您的客戶端向服務器的請求,並等待響應,之後更新它的時間?或者您的客戶端是否等待並偵聽來自服務器的UDP數據包?無論哪種方式,您都無法真正驗證UDP數據包的傳輸。根據您的需求,設置超時可能對您來說可能是更好的選擇?如果在最近的X秒內沒有更新時間或者類似的東西,顯示警告或拋出異常或其他內容? – Kjartan

回答

8

這是UDP無法實現的。如果你需要一個可靠的連接,你應該使用TCP。

+0

+1,儘管您仍然可以實現與序列號的連接,通過UDP進行確認和重新傳輸。儘管這沒有意義,但我必須將其作爲實驗任務來完成(許多小時和測試幾乎與TCP一樣好,這是真正的痛苦)。 – NotGaeL

1

UDP是無連接協議。當沒有連接時,你無法「檢測」任何東西。您必須使用面向連接的協議(如TCP)才能解決此問題。

Comparison

0

好的。我知道了。但是我可以通過做這樣的事情來檢查丟包情況嗎?例如,如果我將計時器設置爲2秒,然後運行此功能,我可以看到服務器是否正確響應。那我應該知道是否有包丟失?

public bool IsResponseValid() 
    { 
     if(SNTPData.Length < SNTPDataLength || Mode != _Mode.Server) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 
+0

無法抗拒優化代碼的衝動: return SNTPData.Length> = SNTPDataLength && Mode == _Mode.Server; – rmp251

5

你有三個選擇:

  1. 忽略丟棄的數據包
  2. 使用TCP而不是
  3. 建立自己的檢測系統

什麼你問是怎麼做的#3,答案是:

  • 向每個數據包添加數據包號和數據包時間戳。
  • 創建一個數據包棧,並將傳入的數據包插入按數據包編號排序的堆棧中。
  • 只有當分組號爲(最後一個分組號+ 1)的分組時,才從堆棧中刪除分組。
  • 如果數據包存在間隙並且(gap + 1)數據包的時間戳大於某個閾值,則發送「重新傳輸請求」數據包以重新傳輸丟棄的數據包。

擱置一秒..這就是TCP的確如此(*)!你應該只使用TCP!

(*),這是一種簡化,TCP不工作的很大,使這一進程可靠。

0

因爲沒有辦法測試,如果UDP沒有到達,唯一真正的選擇是前面加上「包號」和發送的所有數據,因此如果它不符合下一個號碼,你知道它失去了包..

據我所知,有沒有辦法故意輸掉1個UDP數據包時,除了猛拉電纜和更換..和希望..