很久以前,我還在用C#調用CMD裡的Ping命令這種笨方法,深深地感到沒文化真可怕。
編程環境:VS 2012,.Net 4.5
要使用Ping類就得引用
using System.Net.NetworkInformation;
這次就用控制台吧,沒必要用窗體了,硬盤是用來更重要的東西。
先上單步執行的代碼。
string result = "";
Ping p1 = new Ping();
PingOptions po = new PingOptions();
//指定跳躍次數,默認120
//po.Ttl = 64;
//分包發送
po.DontFragment = true;
//指定包大小
string sData = new string('a', 32);
byte[] data = Encoding.ASCII.GetBytes(sData);
//結果返回
PingReply pr;
for (int i = 0; i <= 100; i++)
{
// 主機,超時時間,包,設置
pr = p1.Send("www.baidu.com", 1000, data, po);
if (pr.Status == IPStatus.Success)
{
result = ("IP:" + pr.Address.ToString());
result += " " + ("延遲:" + pr.RoundtripTime) + "ms";
result += " " + ("TTL:" + pr.Options.Ttl);
result += " " + ("分段:" + pr.Options.DontFragment);
result += " " + ("包大小:" + pr.Buffer.Length);
Console.WriteLine(result);
}
else
{
Console.WriteLine(pr.Status.ToString());
}
註釋都有了,不解釋,也不是些什麼很複雜的東東。
接著的是異步
//異步
static void AsyncPing()
{
Ping p1;
PingOptions po = new PingOptions() { DontFragment = true };
string sData = new string('a', 32);
byte[] data = Encoding.ASCII.GetBytes(sData);
for (int i = 10; i <= 100; i++)
{
//每次必須創建新對象,否則無法使用異步
p1 = new Ping();
//監聽完成PING事件
p1.PingCompleted +=new PingCompletedEventHandler(p1_PingCompleted);
p1.SendAsync("www.baidu.com", 1000, data,po,i);
System.Threading.Thread.Sleep(100);
}
}
static void p1_PingCompleted(object sender, PingCompletedEventArgs e)
{
string result = "";
var pr = e.Reply;
if (pr.Status != IPStatus.Success)
return;
result = ("IP:" + pr.Address.ToString());
result += " " + ("延遲:" + pr.RoundtripTime) + "ms";
result += " " + ("TTL:" + pr.Options.Ttl);
result += " " + ("分段:" + pr.Options.DontFragment);
result += " " + ("包大小:" + pr.Buffer.Length) + " 次數:" + e.UserState.ToString();
Console.WriteLine(result);
}
叉,什麼垃圾主機,剛寫完提交出現500錯誤。
忘記要說什麼來着。
是關於I對象的傳遞,這個I在哪裡自己找去 當有對象傳遞給回調方法的時候,方法就可以通過e.Userstate獲取這個對象。
將掛起線程的語句註釋掉,你就看到結果輸出不是按順序輸出了。