soh*_*ham 10 .net c# network-interface
我想用C#.NET我知道,它可以使用来计算通过网络接口,以获得准确的下载/上传速度GetIPv4Statistics().BytesReceived,并把线程睡眠一段时间.但是它没有给出我在浏览器中得到的输出.
小智 9
以下是LINQPad的快速代码片段.它使用非常简单的移动平均线.它使用"Speedtest.net"显示"准确的速度".要记住的是Kbps是比特的,HTTP数据经常被压缩,因此对于高度可压缩的数据,"下载的字节"将显着更小.此外,不要忘记现在任何旧流程都可能在互联网上做任何旧事(没有更严格的防火墙设置)..
我喜欢弗林登贝格的答案(不要改变接受),我注意到一些投票期会返回"0",与他/她的结论一致.
使用自负.
void Main()
{
var nics = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
// Select desired NIC
var nic = nics.Single(n => n.Name == "Local Area Connection");
var reads = Enumerable.Empty<double>();
var sw = new Stopwatch();
var lastBr = nic.GetIPv4Statistics().BytesReceived;
for (var i = 0; i < 1000; i++) {
sw.Restart();
Thread.Sleep(100);
var elapsed = sw.Elapsed.TotalSeconds;
var br = nic.GetIPv4Statistics().BytesReceived;
var local = (br - lastBr) / elapsed;
lastBr = br;
// Keep last 20, ~2 seconds
reads = new [] { local }.Concat(reads).Take(20);
if (i % 10 == 0) { // ~1 second
var bSec = reads.Sum() / reads.Count();
var kbs = (bSec * 8) / 1024;
Console.WriteLine("Kb/s ~ " + kbs);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
请试试这个.检查互联网连接速度.
public double CheckInternetSpeed()
{
// Create Object Of WebClient
System.Net.WebClient wc = new System.Net.WebClient();
//DateTime Variable To Store Download Start Time.
DateTime dt1 = DateTime.Now;
//Number Of Bytes Downloaded Are Stored In ‘data’
byte[] data = wc.DownloadData("http://google.com");
//DateTime Variable To Store Download End Time.
DateTime dt2 = DateTime.Now;
//To Calculate Speed in Kb Divide Value Of data by 1024 And Then by End Time Subtract Start Time To Know Download Per Second.
return Math.Round((data.Length / 1024) / (dt2 - dt1).TotalSeconds, 2);
}
Run Code Online (Sandbox Code Playgroud)
它以Kb /秒为单位提供速度并分享结果.
通过查看您在NetworkInterface.GetIPv4Statistics().BytesReceived 中发布的问题的另一个答案 - 它返回什么?我相信问题可能是您使用的间隔较小。我相信计数器只计算整个包的数量,例如,如果您正在下载一个文件,则包可能会变得与64 KB( IPv4最大包大小)一样大,如果您的最大下载吞吐量是并且您正在测量间隔,那么这个数据包可能会65,535 bytes很大。60 KB/s200 ms
鉴于您的速度是,60 KB/s我会将运行时间设置为 10 秒,以便平均获得至少 9 个包。如果您正在为各种连接编写它,我建议您使解决方案动态化,即如果速度高,您可以轻松地减少平均间隔,但在连接速度慢的情况下,您必须增加平均间隔。
要么按照 @pst 建议的移动平均值,要么简单地将睡眠时间增加到 1 秒。
并且一定要除以实际花费的时间而不是传递给 的时间Thread.Sleep()。
关于间隔的额外思考
我的过程是这样的,测量 5 秒并收集数据,即收到的字节以及数据包的数量。
var timePerPacket = 5000 / nrOfPackets; // Time per package in ms
var intervalTime = Math.Max(d, Math.Pow(2,(Math.Log10(timePerPacket)))*100);
Run Code Online (Sandbox Code Playgroud)
这将导致间隔从大约几十毫秒缓慢增加到每个数据包的时间。这样,我们每个时间间隔总是至少(平均)收到一个包裹,并且如果我们使用 10 Gbps 连接,我们也不会发疯。重要的是测量时间不应与接收到的数据量呈线性关系。
| 归档时间: |
|
| 查看次数: |
28397 次 |
| 最近记录: |