2014-03-13 77 views
0

我正在嘗試開發一些小應用來測量Wi-Fi吞吐量。我到目前爲止的代碼如下:TCP服務器吞吐量減慢

private void handle_connection(IAsyncResult result) 
    { 
     accept_connection(); 
     client = listener.EndAcceptTcpClient(result); 
     long total = 0; 
     double start = DateTime.Now.TimeOfDay.TotalMilliseconds; 
     while ((flag)) 
     { 
      try 
      { 
       NetworkStream ns = client.GetStream(); 
       byte[] bytesFrom = new byte[1024 * 100]; 

       ns.Read(bytesFrom, 0, (int)client.ReceiveBufferSize); 
       total += bytesFrom.Length; 
       double cost = DateTime.Now.TimeOfDay.TotalMilliseconds - start; 
       double megaBytes = (total/(1024.0 * 1024)); 
       double seconds = Convert.ToDouble((cost/1000.0).ToString("0.00")); 
       float MB_Result = Convert.ToSingle((megaBytes/seconds).ToString("0.00")); 
       float Mbit_Result = MB_Result * 8; 

       Invoke(new System.Action(() => chart.Series["Mbps"].Points.AddXY(seconds, Mbit_Result))); 
       Invoke(new System.Action(() => currSpeedLbl.Text = Mbit_Result + " Mbit/s (" + MB_Result + "MB/s)")); 

      } 
      catch(Exception) 
      { 
      } 
     } 


    } 

我嘗試在圖上顯示我的結果。在傳輸的乞求下,我有大約60Mbit/s的速度,但一段時間後下降到1Mbit。我對網絡編程非常陌生,所以我可能做了一些非常愚蠢的事情。我可以問一些建議嗎?謝謝

+2

對於初學者,停止忽略異常..你的問題就像「哦,我不想看到例外,但有些錯誤。告訴我什麼,所以我沒有太多讀取這些例外」 – jgauffin

+0

你忽略'ns.Read'的結果。常見的錯誤。;不要在UI線程上運行阻塞代碼。例如,將此工作轉移到任務。 – usr

+0

此時它在其他線程上工作。 – user1750355

回答

3

您在開始時設置開始,並且在應用程序過程中不更新它。第一次迭代是衡量(現在開始),這將是一個相對較快的時間。以後的迭代將根據(現在 - 開始)進行衡量,這比以前的調用時間要長。爲了準確測量吞吐量,我認爲您需要將開始時間設置爲循環內部,但在讀取之前。

+1

另外,不要每次通過循環重新分配緩衝區。並且請注意'ReceiveBufferSize'不是100KB,因此不等於您實際分配的緩衝區的大小。 – EricLaw