首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求教网络设备监听的方法解决方案

2012-01-20 
求教网络设备监听的方法我们单位有几百台交换机,想做个程序实时检测这些交换机是否正常工作!我的想法是把

求教网络设备监听的方法
我们单位有几百台交换机,想做个程序实时检测这些交换机是否正常工作!
我的想法是把交换机的Ip列表写到数据库中,然后循环读出来,有多少个ip建立多少个线程,去ping这些ip,通过ping返回的信息判断其是否正常.但我让这些线程不停的ping这些交换机,cpu占用率就一直在100%。
1、请高手指点,像这样的监听除了ping的方式还有其他方法吗?
2、如果没有请看看下面的代码可以怎样让cpu占用率降下来?


while   (dr.Read())
                        {
                                myping   myobject   =   new   myping();
                                myobject.ip   =   dr[ "ManageIP "].ToString();
                                myobject.switchDesc   =   dr[ "switchDesc "].ToString();
                                mythread[i]   =   new   Thread(new   ThreadStart(myobject.ping));
                                mythread[i].Start();
                                i   =   i   +   1;
                        }

  public   class   myping
                {
                        public   string   ip;
                        public   string   switchDesc;
                        public   void   ping()
                        {
                                Process   p   =   new   Process();
                                p.StartInfo.FileName   =   "cmd.exe ";
                                p.StartInfo.UseShellExecute   =   false;
                                p.StartInfo.RedirectStandardInput   =   true;
                                p.StartInfo.RedirectStandardOutput   =   true;
                                p.StartInfo.RedirectStandardError   =   true;
                                p.StartInfo.CreateNoWindow   =   true;
                                p.Start();
                                p.StandardInput.WriteLine( "ping   -n   1   "   +   ip);
                                p.StandardInput.WriteLine( "exit ");


                                string   strRst   =   p.StandardOutput.ReadToEnd();
                                string   pingrst;
                                if   (strRst.IndexOf( "(0%   loss) ")   !=   -1)
                                {   pingrst   =   "连接 ";   }
                                else   if   (strRst.IndexOf( "Destination   host   unreachable. ")   !=   -1)
                                {   pingrst   =   "无法到达目的主机 ";   }
                                else   if   (strRst.IndexOf( "Request   timed   out. ")   !=   -1)
                                {   pingrst   =   "超时 ";   }
                                else   if   (strRst.IndexOf( "Unknown   host ")   !=   -1)
                                {   pingrst   =   "无法解析主机 ";   }
                                else
                                {   pingrst   =   "ip为空或者错误的ip格式 ";   }
                                p.Close();
                                if   (pingrst   ==   "超时 "   ||   pingrst   ==   "ip为空或者错误的ip格式 ")
                                {
                                      //向库里记录该交换机的状态省略
                                      Thread.Sleep(2000);
                                        ping();
                                }
                                else
                                {
                                    //向库里记录该交换机的状态省略
                                    Thread.Sleep(2000);


                                        ping();
                                }
                        }

                }

[解决办法]
1. 请高手指点,像这样的监听除了ping的方式还有其他方法吗?
-----------------------------------------------------

交换机很多都允许客户用Socket和它进行连接,你可以查一下你们用的交换机的资料,和它建立一个socket 连接,发一些测试性质的Socket Message,然后再短开连接

2. 如果没有请看看下面的代码可以怎样让cpu占用率降下来?
------------------------------------------------------
减少线程是最直接的办法.


[解决办法]
有一个比较简单的办法: 为每一个交换机生成一个System.Threading.Timer,间隔设置成1秒,在它的CallBack 里检测,但注意1秒间隔比较短,要象下面那样防止上一次检测还未结束下一次又开始.

System.Threading.Timer的CallBack是在.NET自带的线程池中调用的.


public void CheckStatusCallBack(Object stateInfo)
{
if (isCheckingStatus) return;
isCheckingStatus = true;
try
{
//ping 交换机

}
catch (Excpetion ex)
{
}
finally
{
isCheckingStatus = false;
}
}

private _isCheckingStatus = false;
[解决办法]
你这里并不需要该线程池的最大运行线程数,你CPU上到100%是因为你的循环里没有停顿,我没看到你那个线程池的程序里哪里有Sleep啊.

你按下边的试试:

while(true){

//打开一个Reader: dr


while (dr.Read())
{

cs mycs = new cs(dr[ "ManageIP "].ToString(), dr[ "switchDesc "].ToString());
ThreadPool.QueueUserWorkItem(new WaitCallback(ping), mycs);

}
Thread.Sleep(1000);

}

另外你试我那个System.Threading.Timer 的方法了吗?

热点排行