程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#實現Ping功能|根據網址查詢IP

C#實現Ping功能|根據網址查詢IP

編輯:C#入門知識

 

大家應該都知道Ping是做什麼的吧,如果不知道的話,你單擊開始---運行---輸入  ping  www.baidu.com  -t

如下圖

 

\

 

當然我們也可以直接輸入百度的IP進行PIng

 

\

www.2cto.com

 

這有什麼用呢?下面咱們一起來總結一下吧

1.可以檢查一下這個網站是否可以訪問。

2.檢查一下訪問些網站的響應速度

這是我們手動通過電腦來完成的,那怎麼樣使用程序來完成呢?

下面我以WebServces為例子來實現

我們先來新建一個WebServces

當然你也可以新建一個網站,或者是Cs的程序都是沒有任何問題的,同樣都可以使用下面的代碼。

現在我們先來新建 一個類PingServices,主要是完成Ping 的操作,我們使用訪問Exe程序的方式,我們如果打開Windows的System32目錄就能找到有這樣一個程序"ping.exe"

下面就是怎麼訪問的問題了,我們可以使用C#自帶的

   Process proc_Ping = new Process();

   Process 類可以直接訪問Exe程序,定義幾個變量

        //超時時間

        private const int TIME_OUT = 100;

        //包大小

        private const int PACKET_SIZE = 32;

        //Ping的次數

        private const int TRY_TIMES = 1;

 

        //取時間的正則

        private static Regex _reg = new Regex(@"時間=(.*?)ms", RegexOptions.Multiline | RegexOptions.IgnoreCase);

有注釋大家一看就知道了,看下面的設置方法

   ///<summary>

        /// 設屬性

        ///</summary>

        ///<param name="strCommandline">傳入的命令行</param>

        private void SetProcess(string strCommandline)

        {

            //命令行

            proc_Ping.StartInfo.Arguments = strCommandline;

            //是否使用操作系統外殼來執行

            proc_Ping.StartInfo.UseShellExecute = false;

            //是否在新窗口中啟動

            proc_Ping.StartInfo.CreateNoWindow = true;

            //exe名稱默認的在System32下

            proc_Ping.StartInfo.FileName = "ping.exe";

            proc_Ping.StartInfo.RedirectStandardInput = true;

            proc_Ping.StartInfo.RedirectStandardOutput = true;

            proc_Ping.StartInfo.RedirectStandardError = true;

        }

有了上面的這個方法我們接下來就應該是執行了,

        ///<summary>

        /// 得到Ping的結果包括統計信息

        ///</summary>

        ///<param name="strCommandline">傳入的命令行</param>

        ///<param name="packetSize">包的大小</param>

        ///<returns>KB</returns>

        private string LaunchPingStr(string strCommandline, int packetSize)

        {

            SetProcess(strCommandline);

            proc_Ping.Start();

            string strBuffer = proc_Ping.StandardOutput.ReadToEnd();

            proc_Ping.Close();

            return strBuffer;

        }

通過這個方法我們就能得到Ping的結果了,效果和上面的直接寫ping www.baidu.com -t的效果是一樣的。

我們在測試之前先來看下這行命令www.baidu.com -n(次數)1 -1(發送的包大小)  100 -w(超時時間)100 

如果把這行命令直接發送到ping.exe會得到什麼結果呢?

在執行前我們還得來調用下這個方法

現在打開我們剛才新建的WebServces,直接放入這樣一個方法

///<summary>

        /// 得到Ping結果

        ///</summary>

        ///<param name="strHost">主機名或ip</param>

        ///<param name="PacketSize">發送測試包大小</param>

        ///<param name="TimeOut">超時</param>

        ///<param name="TryTimes">測試次數</param>

        ///<returns>字符串</returns>

        [WebMethod]

        public string GetPingStr(string strHost, int PacketSize, int TimeOut, int TryTimes)

        {

            PingServices objPingServices=new PingServices ();

            string result = objPingServices.GetPingStr(strHost, PacketSize, TimeOut, TryTimes);

            return result;

        }

我們執行一下看看會得到什麼結果

參數分別填入strHost=www.baidu.com, PacketSize=32, TimeOut=100,  TryTimes=5

使用的方法如下

    ///<summary>

        /// 得到Ping結果字符串

        ///</summary>

        ///<param name="strHost">主機名或ip</param>

        ///<param name="PacketSize">發送測試包大小</param>

        ///<param name="TimeOut">超時</param>

        ///<param name="TryTimes">測試次數</param>

        ///<returns>kbps/s</returns>

        public string GetPingStr(string strHost, int PacketSize, int TimeOut, int TryTimes)

        {

            return LaunchPingStr(string.Format("{0} -n {1} -l {2} -w {3}", strHost, TryTimes, PacketSize, TimeOut), PacketSize);

        }

 

得到的結果如下圖

 

 

\

 

如上圖,我們就得到了Ping的結果。

下面再來一起看看怎麼樣得到速度吧,

其實也很簡單,我們只要在上面方法的基礎上加以修改就行了,看下面一個方法

  ///<summary>

        /// 得到速度值單位KB

        ///</summary>

        ///<param name="strCommandline">傳入的命令行</param>

        ///<param name="packetSize">包的大小</param>

        ///<returns>KB</returns>

        private float LaunchPing(string strCommandline, int packetSize)

        {

            SetProcess(strCommandline);

            proc_Ping.Start();

            string strBuffer = proc_Ping.StandardOutput.ReadToEnd();

            proc_Ping.Close();

 

            return ParseResult(strBuffer, packetSize);

        }

 

        ///<summary>

        /// 取速度值

        ///</summary>

        ///<param name="strBuffer"></param>

        ///<param name="packetSize"></param>

        ///<returns></returns>

        private float ParseResult(string strBuffer, int packetSize)

        {

            if (strBuffer.Length < 1) return 0.0F;

 

            MatchCollection mc = _reg.Matches(strBuffer);

            if (mc == null || mc.Count < 1 || mc[0].Groups == null) return 0.0F;

            int avg;

            if (!int.TryParse(mc[0].Groups[1].Value, out avg)) return 0.0F;

            if (avg <= 0) return 1024.0F;

 

            return (float)packetSize / avg * 1000 / 1024;

        }

通過這兩個方法就可以取到速度了,

調用的時候基本上我上面的方法一樣,代碼如下所示

 ///<summary>

        /// 根據傳入的參數返回Ping速度結果

        ///</summary>

        ///<param name="strHost">主機名或ip</param>

        ///<param name="PacketSize">發送測試包大小</param>

        ///<param name="TimeOut">超時</param>

        ///<param name="TryTimes">測試次數</param>

        ///<returns>kbps/s</returns>

        public float PingKB(string strHost, int PacketSize, int TimeOut, int TryTimes)

        {

            return LaunchPing(string.Format("{0} -n {1} -l {2} -w {3}", strHost, TryTimes, PacketSize, TimeOut), PacketSize);

        }

效果我就不執行了大家自己來實現一下吧,

完整的類奉上,本文章就到這裡,大家多提建議哦

  View Code

///<summary>

/// 類說明:HttpHelps類,用來實現Http訪問,Post或者Get方式的,直接訪問,帶Cookie的,帶證書的等方式

/// 編碼日期:2011-11-17

/// 編 碼 人:  蘇飛

/// 聯系方式:361983679  Email:[email protected]  Blogs:http://sufei.cnblogs.com

///</summary>

using System;

using System.Collections.Generic;

using System.Web;

using System.Text.RegularExpressions;

using System.Diagnostics;

 

namespace GetPing

{

    public class PingServices

    {

        #region codes

 

        //超時時間

        private const int TIME_OUT = 100;

        //包大小

        private const int PACKET_SIZE = 32;

        //Ping的次數

        private const int TRY_TIMES = 1;

 

        //取時間的正則

        private static Regex _reg = new Regex(@"時間=(.*?)ms", RegexOptions.Multiline | RegexOptions.IgnoreCase);

        Process proc_Ping = new Process();

 

        ///<summary>

        /// 得到速度值單位KB

        ///</summary>

        ///<param name="strCommandline">傳入的命令行</param>

        ///<param name="packetSize">包的大小</param>

        ///<returns>KB</returns>

        private float LaunchPing(string strCommandline, int packetSize)

        {

            SetProcess(strCommandline);

            proc_Ping.Start();

            string strBuffer = proc_Ping.StandardOutput.ReadToEnd();

            proc_Ping.Close();

            return ParseResult(strBuffer, packetSize);

        }

 

        ///<summary>

        /// 設屬性

        ///</summary>

        ///<param name="strCommandline">傳入的命令行</param>

        private void SetProcess(string strCommandline)

        {

            //命令行

            proc_Ping.StartInfo.Arguments = strCommandline;

            //是否使用操作系統外殼來執行

            proc_Ping.StartInfo.UseShellExecute = false;

            //是否在新窗口中啟動

            proc_Ping.StartInfo.CreateNoWindow = true;

            //exe名稱默認的在System32下

            proc_Ping.StartInfo.FileName = "ping.exe";

            proc_Ping.StartInfo.RedirectStandardInput = true;

            proc_Ping.StartInfo.RedirectStandardOutput = true;

            proc_Ping.StartInfo.RedirectStandardError = true;

        }

 

        ///<summary>

        /// 得到Ping的結果包括統計信息

        ///</summary>

        ///<param name="strCommandline">傳入的命令行</param>

        ///<param name="packetSize">包的大小</param>

        ///<returns>KB</returns>

        private string LaunchPingStr(string strCommandline, int packetSize)

        {

            SetProcess(strCommandline);

            proc_Ping.Start();

            string strBuffer = proc_Ping.StandardOutput.ReadToEnd();

            proc_Ping.Close();

            return strBuffer;

        }

 

        ///<summary>

        /// 取速度值

        ///</summary>

        ///<param name="strBuffer"></param>

        ///<param name="packetSize"></param>

        ///<returns></returns>

        private float ParseResult(string strBuffer, int packetSize)

        {

            if (strBuffer.Length < 1) return 0.0F;

 

            MatchCollection mc = _reg.Matches(strBuffer);

            if (mc == null || mc.Count < 1 || mc[0].Groups == null) return 0.0F;

            int avg;

            if (!int.TryParse(mc[0].Groups[1].Value, out avg)) return 0.0F;

            if (avg <= 0) return 1024.0F;

 

            return (float)packetSize / avg * 1000 / 1024;

        }

 

        #endregion 公共方法

 

        ///<summary>

        /// 得到網速

        ///</summary>

        ///<param name="strHost">主機名或ip</param>

        ///<returns>kbps/s</returns>

        public float PingKB(string strHost)

        {

            return LaunchPing(string.Format("{0} -n {1} -l {2} -w {3}", strHost, TRY_TIMES, PACKET_SIZE, TIME_OUT), PACKET_SIZE);

        }

 

        ///<summary>

        /// 得到Ping結果字符串

        ///</summary>

        ///<param name="strHost">主機名或ip</param>

        ///<param name="PacketSize">發送測試包大小</param>

        ///<param name="TimeOut">超時</param>

        ///<param name="TryTimes">測試次數</param>

        ///<returns>kbps/s</returns>

        public string GetPingStr(string strHost, int PacketSize, int TimeOut, int TryTimes)

        {

            return LaunchPingStr(string.Format("{0} -n {1} -l {2} -w {3}", strHost, TryTimes, PacketSize, TimeOut), PacketSize);

        }

 

        ///<summary>

        /// 根據傳入的參數返回Ping速度結果

        ///</summary>

        ///<param name="strHost">主機名或ip</param>

        ///<param name="PacketSize">發送測試包大小</param>

        ///<param name="TimeOut">超時</param>

        ///<param name="TryTimes">測試次數</param>

        ///<returns>kbps/s</returns>

        public float PingKB(string strHost, int PacketSize, int TimeOut, int TryTimes)

        {

            return LaunchPing(string.Format("{0} -n {1} -l {2} -w {3}", strHost, TryTimes, PacketSize, TimeOut), PacketSize);

        }

    }

}

其實在這個基礎之上還可以進行很多操作,比如得到域名的IP

總結一下吧

Ping得到IP,測試網速是很好 工具,但它有一個致命的地方就是很多網站是禁Ping的,如果客戶禁止的話那我們就什麼也訪問不到了,

不過也不用膽心,IP還是可以Ping到的,只是數據包得不到而已。

如果在沒有禁Ping的情況下,使用它還是很省的。

不過Net也有專用查詢IP的方法如下

   ///<summary>

        /// 傳入域名返回對應的IP

        ///</summary>

        ///<param name="domain">域名</param>

        ///<returns></returns>

        public static string getIP(string domain)

        {

            domain = domain.Replace("http://", "").Replace("https://", "");

            IPHostEntry hostEntry = Dns.GetHostEntry(domain);

            IPEndPoint ipEndPoint = new IPEndPoint(hostEntry.AddressList[0], 0);

            return ipEndPoint.Address.ToString();

 

        }

希望大家多提提建議哦

                        

         歡迎大家轉載,如有轉載請注明文章來自:   http://sufei.cnblogs.com/  

簽名:做一番一生引以為豪的事業;在有生之年報答幫過我的人;並有能力幫助需要幫助的人;    

軟件開發,功能定制,請聯系我  QQ:361983679 Email:[email protected]  MSN:[email protected]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved