问题提出,内网数千台设备,想知道他们是否在线。需然网上很多软件可以实现,但是俺还是想通过自己编程解决,最常用的方法是发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); // ping的Option属性
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)</