【问题标题】:How can can I throttle bandwidth on an application domain level in Windows (in user mode)?如何在 Windows 中(在用户模式下)中限制应用程序域级别的带宽?
【发布时间】:2015-02-15 08:01:17
【问题描述】:

我想做以下事情:

  • 我的应用程序在 Windows 机器上运行(称为应用程序 A)。
  • 我可以修改应用 A 的源代码来引入带宽限制。
  • 我希望能够重用我的带宽限制代码并将其放入我拥有的任何其他应用程序中(换句话说,我想尝试在应用程序域级别限制带宽,以便不必重构现有应用程序以进行带宽限制)。
  • 我想分别限制A的累计上传和下载速度。例如,如果 A 分配给上传的最大流量为 5 Kbps,则 A 的所有上传流的累计上限为 5 Kbps。

我的要求:

  • 我无法使用内核模式驱动程序。
  • 我需要在应用程序域级别添加限制。

我曾尝试对此进行研究,尤其是在 Stack Overflow 上,但找不到任何对我的案例有用的东西:

  • 我已经看到this example 在 Stream 对象周围使用 ThrottledStream 类包装器,该类包装器在使用时会引入节流,但我需要在域级别进行;采用这种方法是有问题的,因为它需要我在其他应用程序中重构大量现有代码。
  • 我见过this question,他的回答谈到了使用 Windows 过滤平台 API。不幸的是,我的一个要求是我绝对不能使用内核模式驱动程序来完成此任务,我的理解是 WFP API 需要一个。

有谁知道一种方法来实现我的特定带宽限制要求,以便在应用程序域级别限制应用程序?

【问题讨论】:

标签: c# c++ .net traffic bandwidth-throttling


【解决方案1】:

我想我已经找到了解决办法。使用QOS API,您需要使用TcOpenInterface 获取目标接口的句柄(您可以通过调用TcEnumerateInterfaces 来确定要定位的接口)。使用您的接口句柄,您需要调用TcAddFlow 以及指向TC_GEN_FLOW 结构的指针,它允许您指定SendingFlowspecFLOWSPEC 结构)和ReceivingFlowspecFLOWSPEC 结构)其中包含一个PeakBandwidth 成员。然后,为了让您的界面利用您刚刚添加到其中的流程,您需要使用对TcAddFilter 的调用将过滤器添加到您的界面,正如 MSDN 所说,TcAddFilter 函数将新过滤器与允许匹配过滤器的数据包被定向到关联流的现有流。我认为为了使其特定于应用程序,调用TcRegisterClient 可以解决问题,无论如何您都需要调用它,以便从外观上获取客户端句柄以与 TcEnumerateInterfaces 和 TcAddFlow 一起使用(但这仍有待测试)。我也找到了this useful example(还没有测试过)。

取自 MSDN,PeakBandwidth 成员是给定流的基于时间的传输权限的上限,以每秒字节数为单位。 PeakBandwidth 成员通过强制每秒数据传输上限来限制可能已累积大量传输信用的流量,或因一次性或周期性数据突发的网络资源负担过重而产生的令牌。一些中间系统可以利用这些信息,从而实现更有效的资源分配

【讨论】:

  • 感谢您的提示,您是否找到任何示例代码,或者您是否做过一些?!
  • @Dariush 到目前为止还没有这样做过,抱歉。我的应用程序要求发生了变化,但如果您最终试一试,也许您可​​以使用有助于少数人的程序化解决方案发布更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2019-05-16
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多