C# Ping類的使用方法(單步+異步)
很久以前,我還在用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獲取這個對象。
將掛起線程的語句註釋掉,你就看到結果輸出不是按順序輸出了。