苏飞—Perky Su

签名: 软件开发,功能定制,全国各种接口开发,网页抓取程序,请联系我给我留言      Q Q:                    

posts - 184, comments - 1667, trackbacks - 3, articles - 5
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

Ping检测工具(QQ皮肤实现)

Posted on 2011-12-06 14:14 苏飞 阅读(2571) 评论(12) 编辑 收藏

   最新版的Ping检查工具下载地址: 
            
http://files.cnblogs.com/sufei/Ping.zip  (更新时间2011-12-04)

博客上也写了不少文章,希望做一些组件和工具出来让大家使用。也希望大家帮忙推广,多提建议,在做技术的同时把一个技术和思想产品化其实我感觉挺好的

一直都有这个想法,而且也可以把技术惯串起来

   今天利用之前的C#仿QQ皮肤 做界面,使用一些.net代码来实现Ping的功能。这个工具我会慢慢更新希望大家支持先来秀秀图片

1.项目基本结构

一共上两个项目 一个是皮肤的类库,一个是Ping功能的实现

以后我写工具的话都会以皮肤为基础,希望大家先下载使用

2.PIng界面

在这里你不但可以输入IP地址,还可以输入域名网址

查询结果,超时时间,包大小,次数大家可以自己定义

虽然是个小的工具,但是也是算是走出了第一步吧。

工具里面是源代码,大家可以直接使用Vs2010打开,使用和编辑。

在这上面我放上来一些得要的代码方便查阅吧

View Code
/// <summary>
/// 类说明:PIng检查类
/// 编码日期: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 Ping检查工具
{
public class SpeedServices
{
#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);
}
}
}


-------------------------------------------------------------签名部分------------------------------------------------------------------------

                          

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

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

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


-------------------------------------------------------------------推荐文章--------------------------------------------------------------
1.C#仿QQ皮肤 2.Sql2005学习笔记 3.httpHelper类

Feedback

#1楼  回复 引用 查看   

2011-12-06 14:54 by 发奋图强II      
粗略看了一下代码,使用了多种编码及命名规范:
1. _reg C#的
2. proc_Ping Java的
3. strCommandline C++的
4. namespace Ping检查工具 中文的

#2楼  回复 引用 查看   

2011-12-06 15:03 by 深邃的狮子座      
Cross-thread operation not valid: Control 'txtResult' accessed from a thread other than the thread it was created on.

#3楼[楼主]  回复 引用 查看   

2011-12-06 16:18 by 苏飞      
@深邃的狮子座
如果你的系统不支持多线程的话你可以把这行代码换一下
  // 创建一个子线程

            Thread thread = new Thread(
                delegate()
                {
                    try
                    {
                        txtResult.Text = "现在开始Ping" + txtDomain.Text + "...请稍后";
                        SpeedServices objSpeedServices = new SpeedServices();
                        txtResult.Text = objSpeedServices.GetPingStr(txtDomain.Text.Trim(), Convert.ToInt32(cmbSize.Text.Trim()
                            ), Convert.ToInt32(cmbOutTime.Text.Trim()), Convert.ToInt32(cmbNumber.Text.Trim()));
                    }
                    catch (Exception)
                    {
                        txtResult.Text = "您Ping" + txtDomain + "的过程中出现异常请联系http://sufei.cnblogs.com";
                    }
                }
            );
            thread.Start();

修改成下面的代码
try
                    {
                        txtResult.Text = "现在开始Ping" + txtDomain.Text + "...请稍后";
                        SpeedServices objSpeedServices = new SpeedServices();
                        txtResult.Text = objSpeedServices.GetPingStr(txtDomain.Text.Trim(), Convert.ToInt32(cmbSize.Text.Trim()
                            ), Convert.ToInt32(cmbOutTime.Text.Trim()), Convert.ToInt32(cmbNumber.Text.Trim()));
                    }
                    catch (Exception)
                    {
                        txtResult.Text = "您Ping" + txtDomain + "的过程中出现异常请联系http://sufei.cnblogs.com";
                    }

#4楼  回复 引用 查看   

2011-12-06 16:47 by 闭着眼睛想      
怎么最近都在做ping测试程序啊,我刚刚接了个项目也是和这个相关的,不过我用的是C# ping 类实现的

#5楼  回复 引用 查看   

2011-12-06 16:49 by 深邃的狮子座      
@苏飞
系统不支持多线程是什么意思?我的系统怎么可能不支持多线程呢?



操作系统 Windows 7 专业版 32位 SP1 ( DirectX 11 )

处理器 英特尔 Core i5-2410M @ 2.30GHz 双核
主板 戴尔 04GH8W (英特尔 QM67 芯片组)
内存 4 GB ( 三星 DDR3 1333MHz )
主硬盘 东芝 MK2561GSY ( 250 GB / 4200 转/分 )
显卡 Nvidia NVS 4200M ( 512 MB / 戴尔 )
显示器 三星 SEC544B ( 14 英寸 )
光驱 东芝-三星 DVD+-RW TS-U633J DVD刻录机
声卡 Nvidia @ 英特尔 6 Series Chipset 高保真音频
网卡 英特尔 82579LM Gigabit Network Connection / 戴尔

#6楼  回复 引用 查看   

2011-12-06 17:03 by 海南.胡勇      
When the software project implementation, project personnel data import has been a troublesome issue.

#7楼  回复 引用 查看   

2011-12-06 17:19 by 深邃的狮子座      
@苏飞
你在非UI线程( Thread thread = new Thread()里面操作了UI( txtResult ), 我不知道你那里是怎么运行通过的。你那一改就变成单线程了。不知道我说的对不对。

#8楼  回复 引用 查看   

2011-12-06 17:20 by 深邃的狮子座      
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Ping检查工具
{
    public partial class PingForm : bxyztSkin.CForm.EnterForm
    {
        private UpDateStateDelegate _upDateStateDelegate;
        string domain = string.Empty;
        int packageSize = 0;
        int timeOut = 0;
        int pingNum = 0;
        public PingForm()
        {
            InitializeComponent();
            _upDateStateDelegate=new UpDateStateDelegate(UpDateState);
        }

        private void txtDomain_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnSelect_Click(sender, e);
            }
        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            domain = txtDomain.Text;
            packageSize = Convert.ToInt32(cmbSize.Text.Trim());
            timeOut=Convert.ToInt32(cmbOutTime.Text.Trim());
            pingNum = Convert.ToInt32(cmbNumber.Text.Trim());
            Thread pingTask = new Thread(new ThreadStart(PingTask));
            pingTask.Start();
        }
        private void PingTask()
        {
            try
            {
                this.BeginInvoke(_upDateStateDelegate, string.Format("现在开始Ping: {0} ,请稍后.....", domain));
                SpeedServices objSpeedServices = new SpeedServices();
                this.BeginInvoke(_upDateStateDelegate, objSpeedServices.GetPingStr(domain, packageSize, timeOut, pingNum));
            }
            catch
            {
                this.BeginInvoke(_upDateStateDelegate, string.Format("您Ping {0} 的过程中出现异常", domain));
            }
        }
        private delegate void UpDateStateDelegate(string msg);
        private void UpDateState(string msg)
        {
            txtResult.Text = msg;
         
        }
    }
}


改成这样就可以了

#9楼[楼主]  回复 引用 查看   

2011-12-06 17:49 by 苏飞      
@深邃的狮子座
这个在Win7下面是没有任何问题的,你换下代码就OK了,我测试过N次才放上来的,不过你上面的代码也很好,你可以直接使用,呵呵

#10楼[楼主]  回复 引用 查看   

2011-12-06 17:55 by 苏飞      
@深邃的狮子座
您现在下载一下吧,我更新了,现在在你电脑上肯定没有问题

#11楼  回复 引用 查看   

2011-12-07 11:09 by Cool it      
为什么我返回的时英文的呢?

#12楼[楼主]  回复 引用 查看   

2011-12-07 11:31 by 苏飞      
@Cool it
这个应该跟你操作系统有关系吧,你网上找找看
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2277939 wK2bGPC59Y4=