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

时间:2012-03-11 01:07:57

标签: c# windows networking netstat iphelper

我需要确定与TCPView可以做的类似的每进程网络使用情况统计信息。

Example http://img513.imageshack.us/img513/861/6601f15814544055a590e26.png

所以在你拍我发布this questionthis question的副本之前,我想指出的是,这些都没有一个彻底的答案可以帮助我实际做到这一点。

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

现在,根据谷歌的做法,我没有找到太多 - 除了这些模糊的术语: GetPerTcpConnectionEStats GetPerTcp6ConnectionEStats 。大概分别用于TCP over IPv4和IPv6。现在我正在阅读它所谓的能够做我需要做的事情。但是,这仍然留下了UDP。这些也不适用于TCPViewer可以使用的XP系统。

我会对使用TCP的那些感到满意,但问题是,我似乎无法找到如何在C#中使用它们的任何示例。

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

  • 有没有人真正知道TCPView是如何做到的?
  • 如何为TCP使用GetPerTcpConnectionEStats?或者甚至可以完成我的建议吗?
  • 是否有另一种可用于UDP的已知替代方案?

这一点的全部意义在于查看进程本身的独立带宽使用情况。不计算系统总带宽使用情况。

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

1 个答案:

答案 0 :(得分:1)

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

你显然需要使用PInvoke,我担心这些细节远远超出我的经验。

Wrapper Library on CodeProject使用的AllocateAndGetTcpExTableFromStack仅适用于Windows XP和Server 2003.虽然抱歉,但仍然无法获得带宽。

我能找到的最接近的信息(对于Vista / Server 2008或更新版本)是pinvoke.net上GetExtendedTcpTable的一个例子。

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

如果我继续尝试这个,我会试着弄清楚以下内容:

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