我想在我的 C# 应用程序中按进程测量网络带宽。
我试图在流程对象中找到此信息,但是,此信息不存在。
我也试过使用性能计数器,但我没有按进程找到带宽信息。
对于在 Windows XP 到 Windows 8 上运行的应用程序的进程,您是否有测量网络带宽(发送的网络字节数、接收的网络字节数)的想法?
我知道Windows有这个信息,因为当我们打开“资源监视器”时,我可以在网络选项卡中选择一个特定的应用程序,我们可以实时看到发送和接收的字节数。
谢谢。
最佳答案
据我所知,您不能使用纯 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
返回有关发送和接收的字节数的信息。第二个 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
关于c# - 如何在 c# 中测量从 Windows XP 到 Windows 8 的进程上传和下载网络利用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519608/