2012-05-05 141 views
0

我試圖計算連接的客戶端(服務器 - >客戶端)的延遲我想在我的ping循環期間執行此操作(它測試以查看客戶端是否仍然連接)這裏是我如何ping它(試圖發送數據,如果它失敗客戶端已斷開連接)。計算連接速率(毫秒)(延遲)

 while (information.connectionEst) 
     { 
      try 
      { 


       byte[] data = Encoding.ASCII.GetBytes(""); 

       stream.Write(data, 0, data.Length); 


      } 
      catch (Exception e) 
      { 

       killConnection(); 
       thread.Abort(); 
      } 

     } 

我假設我需要計算髮送數據包所用的時間。但我不知道該怎麼做。任何幫助將被解僱。

+0

一個簡化的解決方案(假設你正在實現客戶端和服務器)是讓服務器將當前時間發送給客戶端,並讓客戶端將其發回,然後找到差異併除以2(假設對稱連接)。 – Adam

+0

這隻會用於本地主機,或同一時區,但不是嗎?這將有多個連接,希望來自不同的國家。 –

+3

客戶的時間沒有進入它。假設服務器上是9:30:00,客戶端上是5:30。服務器向客戶端發送一個包含「9:30:00」的數據包,客戶端將其發回,服務器接收它。現在服務器上的時間是9:30:01,所以服務器可以推斷出它需要1秒的往返時間,或者每個方向的時間爲0.5秒......您可以通過在發送每個數據包的服務器狀態中存儲時間來實現同樣的目的,但這種方式更簡單(也更骯髒)。 – Adam

回答

2

獲得連接的單向延遲(服務器→客戶端)非常困難。如果你知道你在連接的每一端都有非常準確的時間(例如,GPS或原子鐘或與之非常接近的高質量NTP同步時鐘)以及專用於該任務的每端都運行的軟件,則可以這樣做。

否則,您可以做的最好的方法是計算雙向(RTT,往返時間)的延遲,除以2,並希望連接是數據包的路徑是對稱的。如果數據包的路徑不對稱,則數據包在一個方向上的傳輸時間比另一個方向上的傳輸時間要長,並且您無法事先知道多長時間。

計算RTT很簡單:讓第一方發送一條短消息,並讓另一端立即返回另一條消息。第一方減去從發送請求消息以獲取RTT時收到的響應消息的時間。