zoukankan      html  css  js  c++  java
  • C#实现Ping功能|根据网址查询IP

    阅读全文下载例子:http://www.sufeinet.com/forum.php?mod=viewthread&tid=402

    大家应该都知道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);
    }

    效果我就不执行了大家自己来实现一下吧,

    完整的类奉上,本文章就到这里,大家多提建议哦

    View Code
    ///<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();

    }

    希望大家多提提建议哦

    本人的博客不再维护从2013年就不再维护了 需要我帮助的朋友请到我的个人论坛 http://www.sufeinet.com 进行讨论,感谢大家对我的支持!
  • 相关阅读:
    Python学习笔记之操作yalm
    Python学习笔记之多线程
    Python学习笔记之网络编程
    Python学习笔记之面对象与错误处理
    Python学习笔记之装饰器
    Python学习笔记之内置模块
    Python学习笔记之函数与正则
    PAT甲级1049. Counting Ones
    PAT甲级1045. Favorite Color Stripe
    PAT甲级1034. Head of a Gang
  • 原文地址:https://www.cnblogs.com/sufei/p/2253006.html
Copyright © 2011-2022 走看看