ICMP 测不了,数据量太小。这只是检测网络连通性的方法。
网速分为上行和下行,一般都是以下行为准,采用的方法就是下载一个较大的文件。
如果你是在一个终端程序中额外增加的网速监控功能,你可以通过统计终端程序运行时所有的上行和下行数据量来统计速率。
主要是为了判断运行程序的终端当前的网络状况,我试过直接提取操作系统(windows)的网卡的即时上传和下载速率,这个简单点直接调用系统的库就可以做到,但不知道这样能不能达到效果,我程序如果没运行的话是不是就测不出来当前的网络状况了,@Launcher有没有更合适的方法呢?新手摸石头过河的效率太低了,希望能够提供点建议,谢谢。
“采用的方法就是下载一个较大的文件” 其实方法我用代码实现过了,而且可以测上传跟下载速率,但是需要随时监控到当前的网络状况,而不是主动发大量数据去测,并且是在3G4G的网络下,所以要考虑到流量费用的问题...
@scau_Joseph: 你是要测试到你们的服务的网速,还是任意的?
@scau_Joseph: 单纯测速就只能从目标网站下载文件,如果只是想了解程序运行时的网络状态,可以通过统计到目标网站的上行和下行数据量来实现。
@Launcher: 到服务器的,“可以通过统计到目标网站的上行和下行数据量来实现” == “统计终端程序运行时所有的上行和下行数据量” ?
@scau_Joseph: 这就好办了啊!你在你的终端程序中增加一个性能计数器,统计每秒 socket send 和 recv 的字节数,实时更新,这样既能真实反映网络状况,又不增加额外的流量。
@Launcher: 如果我的终端程序在没工作的状态那么我就不能监测到当前的网络状况了。
谢谢一如既往的回答@Launcher
@scau_Joseph: 如果你的程序关闭后,你还想监测当前的网络状态,那么你就需要再写一个程序,此程序可以作为服务或普通进程一直驻留在系统中,在你的应用程序开启时,它可以通过应用程序来获取速率;当你的应用程序关闭后,它就必须自己选择测试的方式,比如发送和接收少量的数据包。
又回到原谅的问题了,“发送和接收少量的数据包” 这个用ICMP请求回应报文实现不可以麽?同样是发少量的字节,就看少量是少到多少了,如果我用之前写的服务-客户端形式,还得再服务器上放一个服务端线程。
@scau_Joseph: 你用什么协议,发多少数据,我都没意见。我只是告诉你单纯的测速,都是通过一个较大的数据量和较长的时间来实现的,这样才比较准确。以具有四个通道的高速收费站为例,如果只有一辆车通过,你一秒统计一次,就是 1 辆每秒;如果有四辆车通过,你一秒统计一次,就是 4 辆每秒。你认为哪个结果最接近真实值?
网速统计,在小数据量上的误差非常大,因为传输 1 个字节的耗时不是传输 1000 个字节的耗时的 1/1000。通常小数量会得到非常大的速率,而实际上不是这样。同时,字节数太少,API 调用耗时占比就会增大,测试结果就更不能反映实际的速率。