`
txf2004
  • 浏览: 6854697 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C#实现Ping功能|根据网址查询IP

 
阅读更多

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

        }

希望大家多提提建议哦

-------------------------------------------------------------签名部分您可以不访问--------------------------------------------------------------

欢迎大家转载,如有转载请注明文章来自: http://sufei.cnblogs.com/

签名:做一番一生引以为豪的事业;在有生之年报答帮过我的人;并有能力帮助需要帮助的人;

软件开发,功能定制,请联系我给我留言 QQ:361983679 Email:sufei.1013@163.com MSN:sufei.1013@163.com

分享到:
评论

相关推荐

    ip检测_批量_ping_C#实现ping功能_

    实现批量PING功能,不再调用cmd窗体,另启用窗体进行调用

    C# PIng IP

    C# PIng IP

    C#实现Tracert/Ping/快速判断端口是否开放

    使用C#实现Tracert功能/Ping功能/快速判断端口是否开放; 代码使用VS2005编译,可使用于后续各个版本的VS. 该代码可用于判断网络是否通畅/网络调试等 ;

    C# .Net 设置固定IP、测试端口、获取本机ip、ping 地址。

    基于 .net framework 4.6 的winfrom 小程序 功能有 获取本机IP 设置本机IP配置为自动...功能实现通过用Socket类、Process类、来调用命令行程序测试和Socket访问端口。 温习知识写的小工具,如果有bug,那么理解万岁

    C# ping ip 程序 实用

    很实用的程序测试网络连接状态的C#程序,简单易懂

    C# 源码 IP PING工具

    C# 源码 IP PING工具 可以添加多组IP段的IP。PING工具。。强大的很。。可以看看

    基于C#实现的Ping

    用C#简单实现ping命令,输入一个网站地址,或者IP,就可以进行ping

    用C#实现PING命令的程序设计

    PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的...有两个程序,一个是利用.NET原有的PING类实现PING命令,另外一个是用自己定义的ICMP报头,设计算法,求得ICMP的回送应答信息。

    C#实现获取多网卡IP地址方法

    C#实现获取多网卡IP地址方法,该方法可以遍历出所有网卡的IP地址。

    C#多线程ping和DOS工具

    本程序采用VS2010软件开发,用的是C#语言,提供源码,主要功能如下 1, 可持续ping 1个IP地址或多个IP地址,可选择记录在指定的文件或自动生成文件记录或不记录。可查看IP什么时候丢包。保存的文件的路径也会做相应...

    c# ping网络ip或网站地址 判断网络是否连接

    就是一个判断本机与某个IP地址、某个电脑是否连通,从而可以判断本机是否在某个网段上,也可以通过ping外网的地址来判断本机是否连网,也可以用来检测某个网站是否还存在可以访问。

    C# PING小工具(除了科来ping就是这个了)

    自作了C#PING工具。 主要功能: ping 指定网址或IP。自动记录ping的信息,下次启动自动开启。 显示当前ping值和平均ping值。还有连接失败的错误率。 可选中列表,使用CTRL + C 键复制ping的结果。 界面如下:...

    C#-批量Ping-IP地址工具.rar

    .Net平台下C#开发的用于批量ping多个IP地址的小工具-Winform版源码

    C# 判断IP地址是否能够PING通

    C# 判断IP地址是否能够PING通

    ping IP 的C#代码

    此代码运行后,可以用来轻易的去ping通别人的代码,非常方便好用

    原始套接字实现Ping命令和Tracert命令

    采用C++语言,基于原始套接字实现了Ping和Tracert命令。发送主机通过ping程序给目标主机发送ICMP的回声请求报文,并根据收到的ICMP回声应答报文来确定网络的连通性。Tracert(跟踪路由)是路由跟踪实用程序,用于...

    C# PING 图形界面

    图形界面的PING程序,可填写ip或域名,c#实现,可带选项

    c#ping测试主机IP

    使用DNS类和IPHostEntry类创建一个如下图所示的域名解析器。用户输入主机名或者DNS域名后,能在下面的列表框中显示与主机名或DNS域名对应的IP地址和别名。

    C# 使用 ping 命令获取相关信息

    C# 使用 ping 命令获取相关信息 使用的C# Process对象

    批量PING ip

    调用cmd.exe ping ip c#编写,内涵部分文件操作

Global site tag (gtag.js) - Google Analytics