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

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

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

我的应用程序连接到Web服务,以发送和接收一些图像文件。

最佳答案

一种方法是检索应用程序的performance counters“.NET CLR网络/已接收字节”和“.NET CLR网络/已发送字节”的值:

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>

在您的app.config中。

要获取完整示例,请下载NetworkTraffic.csNetworkTraffic.exe.config

10-06 02:42