计算带宽

时间:2009-01-14 09:36:39

标签: c# .net

有没有办法可以通过网络计算exe /应用程序的带宽(发送和接收的数据包)?已经陷入IPGlobalProperties

和其他类....我想要一个应用程序收到的数据包发送n .. 我查了http://netstatagent.com/ 我需要类似的东西...... .net中有什么可以帮助我吗?

我的应用程序连接到Web服务以发送一些图像文件...并且还接收文件......

5 个答案:

答案 0 :(得分:22)

一种方法是为您的应用程序检索performance counters“.NET CLR Networking / Bytes Received”和“.NET CLR Networking / Bytes Sent”的值:

PerformanceCounter bytesSentPerformanceCounter= new PerformanceCounter();
bytesSentPerformanceCounter.CategoryName = ".NET CLR Networking";
bytesSentPerformanceCounter.CounterName = "Bytes Sent";
bytesSentPerformanceCounter.InstanceName = GetInstanceName();
bytesSentPerformanceCounter.ReadOnly = true;

float bytesSent = bytesSentPerformanceCounter.NextValue();

//....

private static string GetInstanceName()
{
  // Used Reflector to find the correct formatting:
  string assemblyName = GetAssemblyName();
  if ((assemblyName == null) || (assemblyName.Length == 0))
  {
    assemblyName = AppDomain.CurrentDomain.FriendlyName;
  }
  StringBuilder builder = new StringBuilder(assemblyName);
  for (int i = 0; i < builder.Length; i++)
  {
    switch (builder[i])
    {
      case '/':
      case '\\':
      case '#':
        builder[i] = '_';
        break;
      case '(':
        builder[i] = '[';
        break;

      case ')':
        builder[i] = ']';
        break;
    }
  }
  return string.Format(CultureInfo.CurrentCulture, 
                       "{0}[{1}]", 
                       builder.ToString(), 
                       Process.GetCurrentProcess().Id);
}

private static string GetAssemblyName()
{
  string str = null;
  Assembly entryAssembly = Assembly.GetEntryAssembly();
  if (entryAssembly != null)
  {
    AssemblyName name = entryAssembly.GetName();
    if (name != null)
    {
      str = name.Name;
    }
  }
  return str;
}

请注意,性能计数器 在第一次使用相关网络库之前不会创建(您将获得InvalidOperation:实例'XXX'不存在在指定的类别中)并且您需要插入

<configuration>
  <system.net>
    <settings>
      <performanceCounters enabled="true" />
    </settings>
  </system.net>
</configuration>
中的

要获得完整的样本下载NetworkTraffic.csNetworkTraffic.exe.config

答案 1 :(得分:4)

我记得读过一篇关于此的文章并为你挖出来,http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/

他们的代码之前的摘录:

  

.NET有三个性能   计数器中使用的参数   网络利用率公式出来了   框。所有这些柜台都位于   在网络接口类别和   名为“字节发送/秒”,“字节   收到/秒“和”当前带宽“。   唯一需要一些的参数   需要额外的努力来计算   time_in_sec。

     

“发送的字节数/秒”和“字节数”   收到/秒“计数器计算他们的   基于不同样本和   获得更好价值的最佳方式   从这些柜台找到了   循环中它们的值的总和   因为在某些情况下他们的价值可能会   是零或非常不同于   网络的真实状态。然后我们可以   找到time_in_sec参数   找到那个的次数   循环是因为我们的   性能计数器找到它们的值   总时间为一秒钟   秒等于数量   迭代。

答案 2 :(得分:0)

我查找每个应用程序的字节数/秒...不适用于整个计算机....似乎不适用于控制台应用程序...错误消息:“控制台应用程序在指定的类别中不存在。”

答案 3 :(得分:0)

据我所知,这不起作用 bytesSentPerformanceCounter.InstanceName =“”//这里你需要提供网卡名称......

答案 4 :(得分:0)

以某种方式发送的字节比收到的字节少得多......它不是我从我的应用程序浏览网...我发送到Web服务图像(作为字节)和其他XML文件(几个kbs作为字符串输入到Web服务功能)。作为回报,我有时会返回错误代码或bool ...仍然发送的字节太少于收到...收到的是5倍......我很困惑......