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

Posted

技术标签:

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

我想做以下事情:

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

我的要求:

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

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

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

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

【问题讨论】:

我不确定这与***.com/questions/27512920/… 有何不同,但您声称它们是...另一方面,两者看起来都像“搜索工具/库”,因此可能会分别关闭. 请注意,.Net Framework 中没有内置这样的 API,因此您真的很喜欢搜索库。 @AlexeiLevenkov 另一个人无权访问应用程序 A 的源代码,因此它永远不会在应用程序域级别引入限制。不过,谢天谢地,自从我写这篇文章以来,我的要求发生了变化! @AlexeiLevenkov QoS API 怎么样?我知道基于策略的 QoS 可以做到这一点(technet.microsoft.com/en-us/library/dd919203%28v=ws.10%29.aspx)并且 QoS 有自己的 API。该 API 可以与策略相同吗?我猜如果没有,仍然可以编写一些代码来创建此类策略。 PeakBandwidth (msdn.microsoft.com/en-us/library/windows/desktop/…) 应该是我需要的。它是给定流的基于时间的传输权限上限,以每秒字节数为单位。 当调用 WSCInstallQOSTemplate (msdn.microsoft.com/en-us/library/windows/desktop/…) 时,此 FLOWSPEC 是通过 QOS 结构 (msdn.microsoft.com/en-us/library/windows/desktop/…) 传入的 【参考方案1】:

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

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

【讨论】:

感谢您的提示,您是否找到任何示例代码,或者您是否做过一些?! @Dariush 到目前为止还没有这样做过,抱歉。我的应用程序要求发生了变化,但如果您最终试一试,也许您可​​以使用有助于少数人的程序化解决方案发布更好的答案。

以上是关于如何在 Windows 中(在用户模式下)中限制应用程序域级别的带宽?的主要内容,如果未能解决你的问题,请参考以下文章

Unity中,将UI限制在手机的安全区内显示

如何强制 iOS 应用以纵向模式启动

Oracle Apex 中文本项字段中的字符限制

Linux 下如何限制 ROOT 用户远程登陆?

windows server 2012 如何设置远程登录同时多用户登录

如何在引导模式中显示导出按钮?