提问人:caesay 提问时间:3/11/2012 最后编辑:Communitycaesay 更新时间:5/18/2012 访问量:2655
获取每个连接带宽统计信息
Getting per connection bandwidth statistics
问:
我需要确定每个进程的网络使用情况统计信息,类似于 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?
这样做的重点是查看进程本身的独立带宽使用情况。不计算系统总带宽使用量。
提前感谢您的任何和所有答案。
答:
我花了一些时间试图弄清楚我该如何做类似的事情(延迟与带宽),但由于缺乏投资时间而不得不放弃。我想我会在这里添加我的发现,希望我们最终得到答案。
您显然需要使用 PInvoke,恐怕具体情况远远超出了我的经验。
CodeProject 上的此包装库使用 AllocateAndGetTcpExTableFromStack,它仅适用于 Windows XP 和 Server 2003。对不起,它仍然没有给你带宽。
我能找到的最接近的信息作为起点(对于 Vista/Server 2008 或更高版本)是 GetExtendedTcpTable pinvoke.net 上的示例。
PInvoke Interop Assistant 工具可能有助于确定如何调用非托管代码。
如果我继续尝试,我会尝试弄清楚以下几点:
- 如何调用 SetPerTcpConnectionEStats 以通过适当的TCP_ESTATS_TYPE启用 TcpConnectionEstatsBandwidth 的收集。
- 我将使用 IPGlobalProperties.GetActiveTcpConnections 来获取创建MIB_TCPROW所需的信息。
- 确定如何调用 GetPerTcpConnectionEStats 来监视数据。
评论