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

我想发生以下情况:

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

我的要求:

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

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

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

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

我想我找到了解决方案。 使用QOS API ,您需要使用TcOpenInterface获取目标接口的句柄 (您可以通过调用TcEnumerateInterfaces来确定要定位的接口)。 使用接口句柄,您需要调用TcAddFlow以及指向TC_GEN_FLOW结构的指针,该结构允许您指定包含PeakBandwidth成员的SendingFlowspec ( FLOWSPEC结构)和ReceivingFlowspec ( FLOWSPEC结构)。 然后,为了使您的界面利用您刚添加的流,您需要使用对TcAddFilter的调用向您的接口添加filter,因为MSDN说TcAddFilter函数将新filter与允许数据包的现有流关联匹配filter以指向相关的流程 。 我认为,为了使它特定于应用程序,调用TcRegisterClient可能会做到这一点,你需要调用它才能获得客户端句柄以使用TcEnumerateInterfaces和TcAddFlow从它的外观(但仍有待测试)。 我也找到了这个有用的例子 (没有测试过)。

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