大家應該都知道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]