如何在Windows中(在用户模式下)限制应用程序域级别的带宽?

时间:2014-12-16 21:32:15

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

我想发生以下情况:

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

我的要求:

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

我试图对此进行研究,特别是在Stack Overflow上,但找不到对我的情况有用的东西:

  • 我已经看到this example在Stream对象周围使用ThrottledStream类包装器,它会在使用时引入限制,但是我需要它在域级别;采用这种方法是有问题的,因为它需要我在其他应用程序中重构许多现有代码。
  • 我看到this question的回答是关于使用Windows过滤平台API的。不幸的是,我的要求是我绝对不能使用内核模式驱动程序来实现这一点,我的理解是WFP API需要一个。

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

1 个答案:

答案 0 :(得分:1)

我想我找到了解决方案。使用QOS API,您需要使用TcOpenInterface获取目标接口的句柄(您可以通过调用TcEnumerateInterfaces找出要定位的接口)。使用界面句柄,您需要调用TcAddFlow以及指向TC_GEN_FLOW结构的指针,该结构允许您同时指定SendingFlowspecFLOWSPEC结构)和{ {1}}(FLOWSPEC结构),其中包含ReceivingFlowspec成员。然后,为了使您的界面利用您刚添加的流程,您需要使用TcAddFilter调用向您的界面添加过滤器,因为MSDN说 TcAddFilter函数会关联一个新的过滤器使用现有流,允许匹配过滤器的数据包定向到关联的流。我认为,为了使它特定于应用程序,调用TcRegisterClient可能会做到这一点,你需要调用它才能获得一个客户端句柄来使用TcEnumerateInterfaces和TcAddFlow从它的外观(但这仍然是经过测试)。我也找到了this useful example(还没有测试过)。

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