首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c#中测量按进程将网络利用率上载和下载到Windows8?

如何在c#中测量按进程将网络利用率上载和下载到Windows8?
EN

Stack Overflow用户
提问于 2013-01-25 18:12:59
回答 2查看 1.2K关注 0票数 1

我想在我的C#应用程序中按进程测量网络带宽。

我试图在Process对象中查找此信息,但此信息并不存在。

我也尝试过使用性能计数器,但是我找不到进程的带宽信息。

您是否有通过Windows XP到Windows 8上的应用程序工作的进程测量网络带宽(发送的网络字节数、接收的网络字节数)的想法?

我知道Windows有这个信息,因为当我们打开“资源监视器”时,我可以在网络选项卡中选择一个特定的应用程序,我们可以看到实时发送和接收的字节数。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-25 22:06:42

据我所知,您不能使用纯C#来做到这一点,您必须对IP Helper库进行一些P/Invoke调用。

因为这相当复杂,所以我将简要概述您需要进行的API调用。

首先,这在Windows XP上不起作用,因为有些API是新的(这就是为什么该版本没有资源监视器的原因)。如果你需要Windows XP的支持,恐怕你得使用像WinPCap这样的东西。在Vista+上,随着我们可以进行更新的网络信息调用,事情会变得更好。

对于IPv4、IPv6、TCP和UDP有单独的调用。为简洁起见,我将只概述IPv4/TCP集,因为一旦您理解了这个过程,就可以很容易地复制它来填充其他部分。

首先,您需要调用GetTcpTable2()。这将获得机器上当前处于活动状态的连接表。您最终将得到一个MIB_TCPTABLE2和一堆MIB_TCPROW2结构。每个结构代表一个连接。

MIB_TCPROW2结构有一个PID字段,您可以将其与当前的进程ID相匹配。

因此,这意味着不断轮询连接表,对其进行迭代,并转储与您的进程相关的行。

对于这些行中的每一行,您都必须调用GetPerTcpConnectionEStats()。您会对两种TcpConnectionEstatsData类型感兴趣,第一个stat类型返回有关发送和接收的字节数的信息。第二个TcpConnectionEstatsBandwidth返回有关连接带宽的信息。

我没有展示任何代码的原因是它相当复杂,涉及大量的结构封送处理,但希望我已经为您提供了比您当前拥有的更多的内容。

以下是这些函数的MSDN链接:

GetTcpTable2() - http://msdn.microsoft.com/en-us/library/bb408406(v=vs.85).aspx GetPerTcpConnectionEStats() - http://msdn.microsoft.com/en-us/library/bb485738(v=vs.85).aspx

票数 5
EN

Stack Overflow用户

发布于 2013-11-21 17:03:34

C#中的GetTcpTable2()的一个简单示例。

代码语言:javascript
复制
[DllImport("iphlpapi.dll", SetLastError = true)]
static extern int GetTcpTable2(byte[] pTcpTable, out int pdwSize, bool bOrder);

static void Main(string[] args) {
  int pdwSize = 20000;
  byte[] buffer = new byte[pdwSize];
  int res = GetTcpTable2(buffer, out pdwSize, true);
  if (res != 0) {
    buffer = new byte[pdwSize];
    res = GetTcpTable2(buffer, out pdwSize, true);
    if (res != 0) throw new Exception(res);
  }

  int nOffset = 0;
  var dwNumEntries = Convert.ToInt32(buffer[nOffset]); nOffset += 4;
  Console.WriteLine("total connection: {0}", dwNumEntries);

  for (int i = 0; i < dwNumEntries; i++) {
    Console.WriteLine("*****************");
    int st = Convert.ToInt32(buffer[nOffset]);
    Console.WriteLine("state: {0}", st); nOffset += 4;

    string LocalAdrr = buffer[nOffset].ToString() + "." + buffer[nOffset + 1].ToString() + "." 
      + buffer[nOffset + 2].ToString() + "." + buffer[nOffset + 3].ToString();
    Console.WriteLine("local ip: {0}", LocalAdrr); nOffset += 4;

    int LocalPort = (((int)buffer[nOffset]) << 8) + (((int)buffer[nOffset + 1])) +
      (((int)buffer[nOffset + 2]) << 24) + (((int)buffer[nOffset + 3]) << 16);
    Console.WriteLine("local port: {0}", LocalPort); nOffset += 4;

    string RemoteAdrr = buffer[nOffset].ToString() + "." + buffer[nOffset + 1].ToString() + "." 
      + buffer[nOffset + 2].ToString() + "." + buffer[nOffset + 3].ToString();
    Console.WriteLine("remote ip: {0}", RemoteAdrr); nOffset += 4;

    int RemotePort = (RemoteAdrr == "0.0.0.0") ? 0
      : RemotePort = (((int)buffer[nOffset]) << 8) + (((int)buffer[nOffset + 1])) +
        (((int)buffer[nOffset + 2]) << 24) + (((int)buffer[nOffset + 3]) << 16);
    Console.WriteLine("remote port: {0}", RemotePort); nOffset += 4;

    int pid = BitConverter.ToInt32(buffer.Skip(nOffset).Take(4).ToArray(), 0);
    Console.WriteLine("pid: {0}", pid); nOffset += 4;

    int OffloadState = Convert.ToInt32(buffer[nOffset]);
    Console.WriteLine("OffloadState: {0}", OffloadState); nOffset += 4;
  }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14519608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档