gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:35 24 4
gpt4 key购买 nike

我想实现以下目标:

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

我的要求:

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

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

  • 我看到了this example在 Stream 对象周围使用 ThrottledStream 类包装器,在使用时会引入节流,但我需要它处于域级别;采用这种方法是有问题的,因为它需要我重构其他应用程序中的大量现有代码。
  • 我看到了this question谁的回答是关于使用 Windows Filtering Platform API 的。不幸的是,我有一个要求是我绝对不能使用内核模式驱动程序来完成此操作,我的理解是 WFP API 需要一个。

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

最佳答案

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

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

关于c# - 如何在 Windows 中(在用户模式下)限制应用程序域级别的带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27514288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com