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

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

我的要求:

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

我已经尝试研究这个问题,特别是在Stack Overflow上,但没有找到适合我的情况的有用信息:

  • 我看到了这个示例,它使用ThrottledStream类包装Stream对象,在使用时会引入限制,但我需要在域级别上实现,采取这种方法是有问题的,因为它需要我重构其他应用程序中的大量现有代码。
  • 我看到了这个问题,其答案讲述了使用Windows Filtering Platform API。不幸的是,我有一个要求,绝对不能使用内核模式驱动程序来完成此任务,而我的理解是WFP API需要一个。

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


@AlexeiLevenkov,另一个程序没有访问应用程序A的源代码,因此永远无法在应用程序域级别引入限流。不过,自从我写下这些要求以来,我的需求已经改变,谢天谢地! - Alexandru
@AlexeiLevenkov QoS API怎么样?我知道基于策略的QoS可以做到这一点(http://technet.microsoft.com/en-us/library/dd919203%28v=ws.10%29.aspx),并且QoS有自己的API。那个API是否可以像策略一样实现相同的功能?我猜,即使不能,仍然可以编写代码来创建这些策略。 - Alexandru
糟糕,我说得太早了 - “[此函数在Windows Vista中不受支持]”。 - Alexandru
然而,它已经被更新到一个新的API(http://msdn.microsoft.com/en-us/library/windows/desktop/aa374469(v=vs.85).aspx),具有新的流量控制选项。(http://msdn.microsoft.com/en-us/library/windows/desktop/aa374469(v=vs.85).aspx) - Alexandru
我真的找不到任何新版本API的QoS API示例... - Alexandru
显示剩余3条评论
1个回答

2

我认为我已经找到了一个解决方案。使用 QOS API, 你需要使用 TcOpenInterface 获取目标接口的句柄(你可以通过调用 TcEnumerateInterfaces 来确定要定位的接口)。使用接口句柄,你需要调用 TcAddFlow 并传递一个指向 TC_GEN_FLOW 结构的指针,该结构允许你指定一个 SendingFlowspec (FLOWSPEC 结构) 和一个包含 PeakBandwidth 成员的 ReceivingFlowspec (FLOWSPEC 结构)。然后,为了使你的接口利用刚刚添加的流,你需要使用调用 TcAddFilter 向接口添加一个过滤器,因为 MSDN 表示:TcAddFilter 函数将新的过滤器与现有的流关联起来,以允许匹配过滤器的数据包被定向到相关联的流中。我认为为了使其应用程序特定,调用 TcRegisterClient 可能会奏效,从这个样子看你需要调用它以获取用于 TcEnumerateInterfaces 和 TcAddFlow 的客户端句柄(但这仍需测试)。我也找到了 这个有用的例子(尚未测试)。
从MSDN中提取,PeakBandwidth成员是给定流的基于时间的传输许可的上限,以每秒字节数表示。 PeakBandwidth成员通过强制执行每秒数据传输上限,限制可能已经获得大量传输信用或令牌的流,以防止其用一次性或周期性数据突发过载网络资源。一些中间系统可以利用这些信息,从而实现更有效的资源分配。

谢谢你的建议,你有找到任何示例代码吗?或者你自己写过一些吗?! - dariush
@Dariush 我目前还没有做任何这方面的工作,很抱歉。应用要求对我进行了更改,但如果你尝试一下,也许你可以发布一个更好的答案,并提供一个编程解决方案,能够帮助到一些人。 - Alexandru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接