读书人

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

发布时间: 2012-01-20 18:53:53 作者: rapoo

求教网络设备监听的方法
我们单位有几百台交换机,想做个程序实时检测这些交换机是否正常工作!
我的想法是把交换机的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 的方法了吗?

读书人网 >C#

热点推荐