【发布时间】:2012-02-22 12:08:03
【问题描述】:
我们正在开发一个将安装在 PC 上的应用程序,它将执行一些后台上传和下载到我们的服务器的操作。其中一项要求是检测 Internet 连接当前是否繁忙(例如,利用率高于 50%),如果是,则需要退出并再次尝试。主要原因是为了确保应用不会干扰用户在玩游戏、看在线电影或大量下载文件时的体验
经过对谷歌的大量思考和研究,当然还有 SO,我仍然没有找到如何实现这一点的好方法,所以决定把它扔在这里。 该应用程序是用 C#、.NET 4.0 实现的,我正在寻找所有形式的响应——无论是用 C# 还是其他语言实现、伪逻辑或如何实现的方法——测量互联网流量利用率具有足够准确度的本地 PC。
为了避免重复劳动,到目前为止我已经尝试了这些(以及为什么它们不适合)
- 使用 WMI 获取网络统计信息。大多数 SO 帖子和解决方案都将其称为方法,但它不符合我们的要求,因为根据网络接口容量(例如 1GB 以太网卡)测量发送/接收的字节以供使用将产生一个很好的 LAN 流量测量但不适用于互联网流量(实际互联网带宽可能只有 8Mbps)
- 使用 .NET 网络信息统计或性能计数器 - 产生与上述相似的读数,因此具有相同的缺点
- 使用 ICMP (Ping) 并测量 RTT。有人建议 400 毫秒 RTT 被认为是网络繁忙的慢速和良好指示,但是我被告知使用调制解调器的用户(是的,我们必须支持),使用反向代理或微波链路通常会得到 ping 以上,因此不是一个好衡量
- 开始下载已知文件并测量速度 - 这本身会产生我们试图避免的流量,而且如果此检查执行得足够频繁,我们的应用程序最终会产生大量互联网流量 - 这同样不理想
- MOD:使用 BITS - 可以在用户 PC 上禁用此服务,需要更改组策略并假设服务器是 IIS(具有自定义配置),在我们的例子中,我们的服务器不是 IIS
就是这样,我很困惑并寻求一些建议。我突出显示了问题文本,这样你们就不会迷失阅读本文并想知道问题是什么。谢谢。
【问题讨论】:
-
正确的解决方案是路由器上的 QoS。可惜大多数消费级路由器都很糟糕。
-
似乎是一个常见问题,但似乎没有通用解决方案:(
-
因为这个问题在PC层面是不可能解决的。您的软件无法知道使用同一路由器的其他人正在产生多少流量。
-
我非常同意你的看法。在我放弃之前,我想,我应该看看其他人是否有同样的想法,或者过去可能已经用一些聪明的想法解决了这个问题并愿意分享他们的经验。
-
如果您的上传或下载开始时间超过 N 秒,您可以限制它,然后在 N 后全速重试秒数?
标签: c# .net language-agnostic network-utilization