【问题标题】:Calculating Bandwidth计算带宽
【发布时间】:2019-09-17 17:30:10
【问题描述】:

有什么方法可以通过网络计算 exe/应用程序的带宽(发送和接收的数据包)?已经研究了IPGlobalProperties 和其他类。

我想要由单个应用程序发送和接收的数据包。我检查了http://netstatagent.com/,需要类似的东西。

.Net 中有什么可以帮助我的吗?

我的应用连接到网络服务以发送和接收一些图像文件。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    一种方法是为您的应用程序检索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 : Instance 'XXX' does not exist在指定的类别中)并且您需要插入

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

    在您的 app.config 中。

    如需完整示例,请下载NetworkTraffic.csNetworkTraffic.exe.config

    【讨论】:

    • 这段代码似乎不再起作用,并且每次都给出nvalidOperation : Instance 'XXX' does not exist in the specified Category 错误。
    • 我使用的是 windows 7 和 .net 4.0
    • “请注意,直到您第一次使用相关网络库时才会创建性能计数器”这应该是粗体:)。我花了很多时间试图找出问题所在,因为在其他解决方案中没有提到它。
    【解决方案2】:

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

    他们的代码之前的摘录:

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

    “每秒发送的字节数”和“字节数 Received/sec" 计数器计算其 基于不同样本的值和 获得更好价值的最佳方式 从这些柜台正在寻找 在循环中对它们的值求和 因为在某些情况下,它们的值可能 为零或与 网络的真实状态。然后我们可以 找到 time_in_sec 参数 找到的次数 循环是迭代的,因为我们的 性能计数器找到它们的值 一秒钟的总时间 秒数等于 迭代。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 每个进程都有性能计数器的实例。您使用 InstanceName 属性来选择您想要的。 (PS。你应该为这样的事情添加评论而不是答案)。
      【解决方案4】:

      这不起作用...据我所知 bytesSentPerformanceCounter.InstanceName ="" //这里需要给网卡名...

      【讨论】:

      • InstanceName 是 PerformanceCounter 实例的名称。 CLR 的格式与我编写的代码完全相同,基本上是“ApplicationName [ProcessId]”。尝试下载我附加到原始帖子的代码。它非常适合我(Vista 32 位,.Net 2.0)。
      • 嗨 Rasmus,感谢您的代码...它运行良好...但是发送和接收的字节数始终为 0...我得说您当然对 .net 的这一领域非常了解...我无法添加评论,因为“评论需要 50 声望”
      • Rasmus,我想知道你能否指出一个很好的性能计数器资源.. 也许是一本书......
      • 对不起。我想不出任何好的资源。也许您应该将此作为一个单独的问题提出?
      【解决方案5】:

      不知何故,发送的字节比接收的字节少...这不是我从我的应用程序浏览网络...我发送到 Web 服务图像(作为字节)和其他 XML 文件(几 kbs 作为字符串输入到网络服务功能)。作为回报,我有时会返回错误代码或布尔值...发送的字节仍然比收到的少得多...收到的字节数是 5 倍...我很困惑...

      【讨论】:

      • 尝试使用 WireShark 查看实际发送和接收的数据。并仔细检查您是否没有切换接收和发送。您还可以尝试使用性能监视器检查性能计数器。
      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多