获取每个连接带宽统计信息

Getting per connection bandwidth statistics

提问人:caesay 提问时间:3/11/2012 最后编辑:Communitycaesay 更新时间:5/18/2012 访问量:2655

问:

我需要确定每个进程的网络使用情况统计信息,类似于 TCPView 可以执行的操作。

示例 http://img513.imageshack.us/img513/861/6601f15814544055a590e26.png

因此,在你因为我发布这个问题或这个问题的重复而向我开枪之前,我想指出,这两个问题都没有一个彻底的答案可以帮助我真正做到这一点。

我一直在做研究,显然有很多方法可以列出活动连接及其相关进程,无论是使用 netstat 还是其他 Windows API,如 IpHlpAPI.dll

现在,从我所做的谷歌工作来看,我没有发现太多 - 除了这些模糊的术语:GetPerTcpConnectionEStats 和 GetPerTcp6ConnectionEStats大概分别用于 IPv4 和 IPv6 上的 TCP。现在我正在阅读的地方,它应该能够做我需要做的事情。但是,这仍然遗漏了 UDP。这些在 TCPViewer 工作的 XP 系统上也不可用。

我对将它们用于 TCP 感到满意,但问题是,我似乎找不到任何如何在 C# 中使用它们的示例。

所以我想这一切都归结为以下几个问题:

  • 有谁真的知道TCPView是怎么做到的?
  • 如何将 GetPerTcpConnectionEStats 用于 TCP?或者它甚至可以完成我的建议吗?
  • 是否有另一种已知的替代方法适用于 UDP?

这样做的重点是查看进程本身的独立带宽使用情况。不计算系统总带宽使用量。

提前感谢您的任何和所有答案。

C# Windows 网络 netstat iphelper

评论

0赞 Roman Starkov 3/20/2012
您很可能可以通过 WMI / 性能计数器来做到这一点,但是我个人发现这些 API 相当神秘......以防万一你没有得到好的答案,并且正在为谷歌寻找更多的关键词。
0赞 caesay 6/15/2013
@TomerPeled:我从来没有找到解决方案,并放弃了这个项目(因为无论如何这是个人的)。但是,如果您确实找到了如何确定各个进程的带宽使用情况,请将其作为答案发布,这可能会激发我完成旧项目的动力:)

答:

2赞 Hastarin 5/18/2012 #1

我花了一些时间试图弄清楚我该如何做类似的事情(延迟与带宽),但由于缺乏投资时间而不得不放弃。我想我会在这里添加我的发现,希望我们最终得到答案。

您显然需要使用 PInvoke,恐怕具体情况远远超出了我的经验。

CodeProject 上的此包装库使用 AllocateAndGetTcpExTableFromStack,它仅适用于 Windows XP 和 Server 2003。对不起,它仍然没有给你带宽。

我能找到的最接近的信息作为起点(对于 Vista/Server 2008 或更高版本)是 GetExtendedTcpTable pinvoke.net 上的示例。

PInvoke Interop Assistant 工具可能有助于确定如何调用非托管代码。

如果我继续尝试,我会尝试弄清楚以下几点:

  1. 如何调用 SetPerTcpConnectionEStats 以通过适当的TCP_ESTATS_TYPE启用 TcpConnectionEstatsBandwidth 的收集。
  2. 我将使用 IPGlobalProperties.GetActiveTcpConnections 来获取创建MIB_TCPROW所需的信息。
  3. 确定如何调用 GetPerTcpConnectionEStats 来监视数据。