C#实现Ping功能|根据网址查询IP
来源:互联网 发布:微信收红包网络出错 编辑:程序博客网 时间:2024/06/04 20:24
大家应该都知道Ping是做什么的吧,如果不知道的话,你单击开始---运行---输入 ping www.baidu.com -t
如下图
当然我们也可以直接输入百度的IP进行PIng
这有什么用呢?下面咱们一起来总结一下吧
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); }
效果我就不执行了大家自己来实现一下吧,
完整的类奉上,本文章就到这里,大家多提建议哦
///<summary>/// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式/// 编码日期:2011-11-17/// 编 码 人: 苏飞/// 联系方式:361983679 Email:sufei.1013@163.com 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:sufei.1013@163.com MSN:sufei.1013@163.com
- C#实现Ping功能|根据网址查询IP
- C#实现Ping功能|根据网址查询IP
- C#实现根据域名查询ip实例
- C#实现根据域名查询ip实例
- c#实现ping功能
- c#实现根据网络IP显示地理位置功能
- C#实现根据域名查询ip实例(原创)
- C#下实现ping功能
- C#下实现ping功能
- C#下实现ping功能
- C# 实现的Ping功能
- C#实现百度ping功能
- C#根据IP查询省份、城市,纯真IP库实现方式+无IP库实现方式
- Java技巧: 根据网址查询DNS/IP地址
- C# winform 根据域名查询IP
- Ping 功能C#3行代码实现
- Qt5.2中使用ping命令实现Ip扫描功能
- Java实现IP是否能Ping通功能
- 端口号
- CMD 命令大全
- 线程同步-互斥量
- 孤胆战机:以彼之矛攻其自身的特殊射击游戏
- Android OpenGL教程-第一课
- C#实现Ping功能|根据网址查询IP
- SQL 语句大全
- iphone 表情编码
- HTML5学习笔记第一节(智能提示和视频音频标签)
- HTML5学习笔记第二节(Email标签(自动验证格式),Number标签,URL标签...)
- 15.2.2 介绍行为
- 史上最牛Myeclipse序列码
- 一起动手实现Windows服务程序(监控网站是否能访问)
- QT 中实现图片渐显