2014-03-13 71 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