菜鸡的学习之旅(七)

最近花了点时间,做了一下测量网速的软件,其实做好了发现并不难但是写的过程中难免云里雾里,刚开始直接使用C#中的ping,但是总是出问题,无法执行,后来使用C#调用cmd中的ping,问题更大,成功倒是可以的,但是响应时间过长3.5s才能跳东西出来,实在是太慢了,于是最后还是用了C#的ping类。

刚开始老大让我做测网速的tool的时候我是有点抗拒的,网上随便搜了一下发现用 ping IP 可以发送字节给IP并且收到回复,还有耗时,但是大多数都是ping默认的32字节,在现在的网络环境中,32字节有点太少了,老大让我ping1500字节,但是我发现公司的这个千兆路由太快了 一直显示0ms,这可怎么办,后来想了个办法,加大传输的数据包,刚开始不用路由器大概ping默认网关17900Byte耗时3ms,后来用了路由器ip地址,更快了,又变成0ms,最后我用了32000 Byte,这部分我写死了,而且看了一下网上没有类似测量方法,所以整理出来供参考。

 

首先看调用C# ping的方法:

string strDestIp = "192.168.1.1";//需要ping的那个IP地址
int timetravel = 0;
float speed = 0;

Ping myPing = new Ping();
PingOptions myOptions = new PingOptions();
string data = "";
for (int i = 0; i < 1000; i++)//因为要传送32000字节,所以写了一个循环,把32字节的数据循环1000次
{
    string datapart = "abcdefghijklmnopqrstuvwxyz123456";
    data = data + datapart;//这样就能得到一千个连在一起的32字节了
}

byte[] buffer = Encoding.ASCII.GetBytes(data);//转换字节,现在我们输入的都存在buffer里了

myOptions.DontFragment = false;//注意!这里千万要设置好,之前在这里卡了很久
                               //这句的意思就是使数据包碎片化,如果不碎片化是无法成功传送的!
PingReply myPingReply = myPing.Send(strDestIp, 1200, buffer, myOptions);
//传送,并把应答的所有数据全部储存在myPingReply中

if (myPingReply.Status == IPStatus.Success)
{ 
    str1 = "数据包是否分段:" + myPingReply.Options.DontFragment;
    str2 = "主机地址:" + myPingReply.Address;
    str3 = "往返时间::" + myPingReply.RoundtripTime;
    str4 = "生存时间TTL:" + myPingReply.Options.Ttl;
    str5 = "缓冲区大小:" + myPingReply.Buffer.Length;
    timetravel = (int)myPingReply.RoundtripTime;              
}
speed = ((float)1000 * 32 * 2 * 8 * 1000) / timetravel / 1024 / 1024;
//这里主要是计算一下网速,通过字节数换算成bitms换成s,除以时间再除两次1024就得到了Mb/s的结果
//*2主要是因为我觉得这个时间是往返的时间,就是说,在这个时间内传输了不只32000数据,而是64000

//因为我用的是C#,把结果整整齐齐输出到窗体中
label1.Text = str1;
label2.Text = str2;
label3.Text = str3;
label4.Text = str4;
label5.Text = str5;
string str6 = "速度为:" + timetravel.ToString() + "Mb/s";
label6.Text = str6;
//以上就是C# ping 计算速度的全部内容,我知道需要计算一下时间戳,但是这个路由实在是太快了
//算出来已经是千兆没错了,从计算结果来看还是符合标准的


这个程序由于之前把myOptions.DontFragment 设成了true,导致一传送超过1504的字节就卡住,我还找不出原因,非常难过。还以为是缓冲区出什么问题了,现在已经可以顺利运行了

大概界面就是这样,有点丑= =大概算出来就是这个意思没有错了。

 

接下来 说一下使用cmd ping的方法

string str = "ping 192.168.1.1 -l 37900" ;//还是传输大数据包,大概先37900好了
System.Diagnostics.Process p = new System.Diagnostics.Process();

p.StartInfo.FileName = "cmd.exe";//打开cmd.exe
p.StartInfo.UseShellExecute = false;    
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();

p.StandardInput.WriteLine(str + "&exit");//开始执行语句
p.StandardInput.AutoFlush = true;

string output = p.StandardOutput.ReadToEnd();//获取cmd窗口的输出信息

p.WaitForExit();//等待程序执行完退出进程
p.Close();

textBox1.Text = output;//输出到textBox中

if (output != null)//老样子,显示一下然后计算速度
{
    int num = output.IndexOf("平均");
    int number= num + 5;
    int timea = (int)output[number] - 48;
    textBox2.Text = "平均时间为:" + timea.ToString();
    textBox3.Text = "速度为:"+ ((double)37900 * 2 * 8 * 1000) / timea / 1024 / 1024 +"Mb/s";
}

运行结果如下所示:

我用了一个蛮笨的方法,遍历所有内容,找出“平均”这个词,看它的位置,然后向后再找,就能找到时间了,然后用字节除以时间,再做一下单位转换,就是速度了。

但是这种方法比较慢,界面大概会卡个3.5s,刚开始是用手机计时器手动按出来的,后来才知道有更方便,更精准的方法,就是使用stopwatch来计时,这一部分网上有很多,我就不一一列举了,确实蛮好用的。

以上就是C#程序ping的两种方法啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值