7

我想让以下事情发生:

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

我的要求:

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

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

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

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

4

1 回答 1

1

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

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

于 2014-12-17T21:42:11.450 回答