用ping方式探测网络连通性--一个小程序

问题提出,内网数千台设备,想知道他们是否在线。需然网上很多软件可以实现,但是俺还是想通过自己编程解决,最常用的方法是发ICMP包,看看设备回应。技术要点

  • 如何发ICMP包,接收设备ECHO信息;
  • 采用多线程设计;
  • ECHO信息在数据库持久化;

编程环境

  • Microsoft Visual Studio 2013
  •  Microsoft Windows 7
  • Microsoft .NET FrameWork 4.5

 

俺参考Ping函数 Microsoft 例子,建立一个发ping的函数JobForAThread(object state),传入的参数是数据库表的实例化对象,程序如下:

  staticvoid JobForAThread(object state)

        {

            int pingcount = 3;  //定义ping的次数

            C2011 who = ((C2011)state); //获取数据库实例

            AutoResetEvent waiter = newAutoResetEvent(false); //

            ConnectedFeedback feedback = newConnectedFeedback(who); //一个自定义类,存放返回ECHO数据

            WoodenStick waitcallbackinstance = newWoodenStick(waiter, feedback); //一个自定义类,封装两个类,下面介绍

 

            Ping pingSender = newPing();

            pingSender.PingCompleted+= newPingCompletedEventHandler(PingCompletedCallback); //聆听ping响应,定义处理函数PingCompletedCallback

 

            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; //定义发送ping的缓存区

            byte[] buffer = Encoding.ASCII.GetBytes(data);

            int timeout = 5000;  //ping 超时阙值

            PingOptions options = newPingOptions(64, true); // pingOption属性

 

            for (int i = 0; i < pingcount; i++)

            {

               pingSender.SendAsync(who.IP, timeout, buffer, options,waitcallbackinstance);//ping包,将类waitcallbackinstance传递到ping响应处理函数

                waiter.WaitOne(); //ping响应无这么快回来,线程无事干,阻塞等候

            }

 

           feedback.Average(pingcount); //计算多次ping的结果,取平均值

 

            //将结果实例化到CO_PingRecord 对象,准备持久化到数据库

CO_PingRecord copingrecord = newCO_PingRecord();

            copingrecord.IP_Adress =feedback.NetIPaddress.ToString();

           copingrecord.Connectivity = feedback.Connectivity;

           copingrecord.RoundTripTime = (int)feedback.RoundTripTime;

            copingrecord.TTL =feedback.TimeToLive;

            copingrecord.CreatDate =DateTime.Now;

           copingrecord.ConnectivityRate = feedback.rate;

            copingrecord.C2011_ID =feedback.C2011ID;

           

            //定义一个DataContext作为数据库连接

            DBAppDataContext db = newDBAppDataContext();

 

            //使用事务处理数据库数据写入

            using (TransactionScope ts = newTransactionScope())

            {

                try

                {   // 插入一个对象,该对象保存计算ECHO结果

                   db.CO_PingRecords.InsertOnSubmit(copingrecord);

                   db.SubmitChanges();

                    ts.Complete();

                }

                catch (SqlException e)</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值