c# - 如何在 c# 中测量从 Windows XP 到 Windows 8 的进程上传和下载网络利用率?

标签 c# networking

我想在我的 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/

相关文章:

c# - 有没有办法显示实现接口(interface)方法的智能感知注释?

c# - DDD 和 IOC 容器

android - 无法在 adb usb 和 adb tcp 模式之间成功切换

java - CCNx Java 代码帮助 (ProcessBuilder)

c# - UpdatePanel 中的 GridView - 在单击按钮时获取更新的文本框值

c# - 如何使用 Lucene.Net 将搜索短语与通配符结合起来?

java - 如何配置主机名解析以使用 Java 中的自定义 DNS 服务器?

Android 同时连接以太网和 Wi-Fi

c++ - 很难理解带有 async_read 和 async_write 的 Boost ASIO TCP 的一些概念

c# - 加密/解密数据最安全的方法是什么?