David
发布于 2014-08-16 / 17 阅读 / 0 评论 / 0 点赞

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());
                }
註釋都有了,不解釋,也不是些什麼很複雜的東東。 图像 010 接著的是異步
        //異步
        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獲取這個對象。 图像 011 將掛起線程的語句註釋掉,你就看到結果輸出不是按順序輸出了。