我想在我的C#应用程序中按进程测量网络带宽。
我试图在Process对象中查找此信息,但此信息并不存在。
我也尝试过使用性能计数器,但是我找不到进程的带宽信息。
您是否有通过Windows XP到Windows 8上的应用程序工作的进程测量网络带宽(发送的网络字节数、接收的网络字节数)的想法?
我知道Windows有这个信息,因为当我们打开“资源监视器”时,我可以在网络选项卡中选择一个特定的应用程序,我们可以看到实时发送和接收的字节数。
谢谢。
发布于 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
发布于 2013-11-21 17:03:34
C#中的GetTcpTable2()的一个简单示例。
[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;
}
}https://stackoverflow.com/questions/14519608
复制相似问题