我想通过使用 C# .NET 的网络接口(interface)获得准确的下载/上传速度
我知道它可以使用 GetIPv4Statistics().BytesReceived 计算,并使线程休眠一段时间。但它没有给出我在浏览器中得到的输出。

最佳答案

通过查看您在 NetworkInterface.GetIPv4Statistics().BytesReceived - What does it return? 中发布的问题的另一个答案,我相信问题可能在于您正在使用小间隔。我相信计数器只计算整个包,例如,如果您正在下载一个文件,这些包可能会大到 64 KB(65,535 bytes,IPv4 最大包大小),如果您的最大下载吞吐量是 0x2518122431343,那么这相当多60 KB/s 间隔。

考虑到您的速度是 200 ms,我会将运行时间设置为 10 秒,这样平均至少可以获得 9 个包。如果您正在为各种连接编写它,我建议您使解决方案动态化,即如果速度很高,您可以轻松减少平均间隔,但在连接速度较慢的情况下,您必须增加平均间隔。

要么按照@pst 建议的方法使用移动平均线,要么简单地将 sleep 时间延长至 1 秒。

并且一定要除以实际花费的时间,而不是传递给 60 KB/s 的时间。

关于间隔的额外想法

我的过程将是这样的,测量 5 秒并收集数据,即收到的字节数以及数据包的数量。

var timePerPacket = 5000 / nrOfPackets; // Time per package in ms
var intervalTime = Math.Max(d, Math.Pow(2,(Math.Log10(timePerPacket)))*100);

这将导致间隔从大约几十毫秒缓慢增加到每个数据包的时间。这样我们每个间隔总是至少(平均)得到一个包,如果我们使用 10 Gbps 连接,我们就不会发疯。重要的部分是测量时间不应与接收的数据量成线性关系。

关于c# - 如何在 C#.NET 中获得准确的下载/上传速度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13600604/

10-16 10:17