【问题标题】:Getting per connection bandwidth statistics获取每个连接的带宽统计信息
【发布时间】:2012-05-18 15:06:23
【问题描述】:

我需要像 TCPView 一样确定每个进程的网络使用统计信息。

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

因此,在你因为我发布了 this questionthis question 的重复而对我开枪之前,我想指出,他们都没有一个可以帮助我真正做到这一点的彻底答案。

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

现在,根据我所做的谷歌搜索,我没有找到太多信息 - 除了这些模糊的术语:GetPerTcpConnectionEStatsGetPerTcp6ConnectionEStats。大概分别用于 IPv4 和 IPv6 上的 TCP。现在我正在阅读它应该能够做我需要做的事情。但是,这仍然忽略了 UDP。这些在 TCPViewer 工作的 XP 系统上也不可用。

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

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

  • 真的有人知道 TCPView 是怎么做的吗?
  • 如何为 TCP 使用 GetPerTcpConnectionEStats?或者它甚至可以完成我的建议吗?
  • 是否有其他已知的替代方案适用于 UDP?

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

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

【问题讨论】:

  • 您很可能可以通过 WMI / 性能计数器来执行此操作,但是我个人认为这些 API 相当晦涩……以防万一您没有得到好的答案并正在寻找更多的关键字来谷歌。
  • 有什么解决办法吗?
  • @TomerPeled:我从来没有找到解决方案,所以放弃了这个项目(因为它是个人的)。如果您确实知道如何确定单个进程的带宽使用情况,请将其作为答案发布,它可能会激发我完成旧项目的动力:)

标签: c# windows networking netstat iphelper


【解决方案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 来监控数据。

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多