Ping 监视器






4.90/5 (23投票s)
2007年7月4日
5分钟阅读

212868

10497
用 VB.NET 和 .NET Framework 2.0 编写的又一个 Ping Monitor 工具
引言
这是用 VB.NET 和 .NET Framework 2.0 编写的又一个 Ping Monitor 工具。它满足了通过“PING”稳定监控网络上某些 PC 和服务器状态(是否在线)的需求,同时记录每次状态转换(在线到离线,反之亦然)的历史,并直观地突出显示每台机器的最后状态。
这个应用程序远非一个完整而复杂的工具。我为一位同事写的,他需要一个更高级、更定制化工具实现的起点。
一个服务,一个数据库,一个用户界面
为了持续监控某些机器,我们需要一个持续运行的监控 EXE。因此,我决定将“监控引擎”实现为一个 Windows 服务应用程序(利用了无人值守执行、断电后自动重启等优势)。这个 `PingMonitorService` 只需要
- 从某个配置存储(如数据库表)读取需要监控的机器列表(以及监控频率);
- 执行实际的监控,向每台配置为需要监控的机器发送“PING”;
- 将每次“PING”的结果记录到某个地方。
除了用于监控的 Windows 服务和作为存储的数据库,我们显然还需要一个用户界面(UI)来与配置和日志进行交互;这就是为什么我创建了一个简单的 Windows 窗体应用程序(名为 `PingMonitor`)来完成这些任务:显示被监控机器的最后 PING 状态并编辑 `PingMonitorService` 的配置。
我决定使用 SQL Server 2000(或 2005)数据库来托管配置(即,要监控的机器列表)和日志。
以下是两个表架构,用 T-SQL 代码表示,并附带一些解释。
配置表
CREATE TABLE HostList (
ID int IDENTITY(1,1) NOT NULL,
Host nvarchar(50) NULL,
IsHost char(1) NULL,
ShowInMonitor char(1) NULL,
DoPing char(1) NULL,
PingFreq int NULL,
IDparent int NULL,
CONSTRAINT PK_HostList PRIMARY KEY CLUSTERED (ID ASC)
WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY
) ON PRIMARY
`HostList` 表将包含要监控的机器列表。对于每台机器,它存储:具有唯一 ID 的机器名称(`Host` 和 `ID` 字段),监控频率(`PingFreq` 字段,以秒为单位),一个指示当前是否激活监控的标志(`DoPing` 字段),以及一个指示特定机器是否要在 UI 中显示的标志(`ShowInMonitor` 字段)。
能够列出一个分层树使您能够将要监控的机器组织成组和子组,`HostList` 表支持父子节点关系(通过 `IDparent` 字段)以及“文件夹”树节点的概念,这些节点是中间节点,不对应于主机,仅仅是其他节点的父节点(对于它们,`IsHost` 标志未设置为“是”)。
`PingMonitor` 应用程序提供的用户界面允许您在直接修改基础 `HostList` 表的同时,直观地编辑树(请注意,节点删除和子节点添加是通过树上的右键菜单允许的)。
日志表
CREATE TABLE PingLog (
Host varchar(50) NOT NULL,
Status varchar(5) NOT NULL,
RecordingDate datetime NOT NULL,
CONSTRAINT [PK_PingLog] PRIMARY KEY CLUSTERED (Host ASC, Status ASC,
RecordingDate ASC)
WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY
) ON PRIMARY
`PingLog` 表将包含在监控时段内,每台被监控机器检测到的每次状态转换(在线到离线或反之)的条目。`Host` 字段包含被监控机器的名称,`RecordingDate` 字段包含记录条目的时间戳,`Status` 字段简单地包含“ON”或“OFF”值(分别表示成功的和不成功的“PING”)。
关于服务的一些说明
`PingMonitorService` 是在 Visual Studio 2005 的标准 Windows 服务应用程序模板上实现的。作为一个标准的 .NET Windows 服务,它必须通过 `installutil.exe` 实用程序安装(有关参考,请参见此处)。
启动时,该服务会读取其 CONFIG 文件以检索
- 到配置数据库的连接字符串(请参阅 `ConnStr` appSetting)
- 配置重载频率(请参阅 `ReloadConfigFrequency` appSetting):它指示重载所有配置参数之前的秒数(这使服务能够根据用户通过 PingMonitor UI 可能修改的 `HostList` 表中的新设置来调整其行为)。
为了确定是否是时候“PING”一台机器,该服务只需查看从午夜开始经过的总秒数,并检查该数字是否是该主机特定 `PingFreq` 的倍数(请注意,只存储状态转换,而不存储每次状态检测)。
' Check if time is come to ping the specific host
If CurrentSecond Mod CInt(dr("PingFreq")) = 0 Then
' Ping the specific host
Dim IsAlive As Boolean = HostIsAlive(dr("Host"))
Dim LastStatus As String = HostLastStatus(dr("Host"))
If LastStatus = "" OrElse _
(LastStatus = "ON" And Not IsAlive) OrElse _
(LastStatus = "OFF" And IsAlive) Then
StoreStatusTransition(dr("Host"), IsAlive)
End If
End If
请注意,`MainTask()` 中的轮询间隔目前设置为 900ms,以确保每秒至少发生一次“滴答”(显然,在某些秒内可能会发生两次)。如果主机列表非常非常大,`TryPing()` 方法的执行可能会长到导致服务错过对某些主机的“PING”(因此请仔细配置主机列表和特定的 `PingFreq`)。
“PING”本身是通过 `System.Net.NetworkInformation.Ping` 类以非常简单的方式完成的。
Private Function HostIsAlive(ByVal Host As String) As Boolean
Dim pingSender As New Ping
Dim reply As PingReply
Try
reply = pingSender.Send(Host)
If reply.Status = IPStatus.Success Then
Return True
Else
Return False
End If
Catch ex As Exception
Return False
End Try
End Function
关于 UI 的一些说明
UI 应用程序非常简单;它由两个窗体组成:监控窗体和配置窗体。
该应用程序需要一个 CONFIG 文件,其中指定了支持数据库的连接字符串(请参阅 `ConnStr` appSetting)。
监控窗体只是一个 `DataGridView`,它由对 `PingLog` 表的查询填充;该查询旨在仅显示每台具有 `ShowInMonitor='Y'` 的主机的最后一条记录。
`DataGridView` 的刷新频率可以在应用程序配置文件中的 `ReloadFrequency` appSetting 中指定。具有“OFF”状态的条目通过简单地实现 `CellFormatting()` 事件处理程序来高亮显示。
Private Sub dgMonitor_CellFormatting(...)
Handles dgMonitor.CellFormatting
Dim v As Object = dgMonitor.Rows(e.RowIndex).Cells("Status").Value
If v IsNot Nothing AndAlso v.ToString() = "OFF" Then
For Each i As DataGridViewCell In dgMonitor.Rows(e.RowIndex).Cells
i.Style.BackColor = Color.Orange
Next
End If
End Sub
配置窗体包含一个带有详细信息面板的树视图,当选中一个主机节点时显示(请参阅文章中的第一张图片)。
这方面无需特别说明。只需注意,底层 `HostList` 表的更新是在修改 UI 控件上的值后立即完成的,通过对 `DataTable` 的更新完成,该 `DataTable` 由 `DataAdapter` 立即写入。
结论
如**引言**中所述,此应用程序应被视为更高级、更定制化工具实现的起点。其基本思想和实现故意非常简单,希望它能帮助您构建更复杂的东西。
下载次数
本文可下载 ZIP 文件内容(现也有 C# 版本)
- `DBTablesCreation.sql` 文件 - 包含在 Microsoft SQL Server 2000/2005 上创建支持数据库表的 T-SQL 脚本;
- `PingMonitorService` 文件夹 - 包含服务的 Visual Studio 2005 项目;
- `PingMonitor` 文件夹 - 包含 UI WinForm 应用程序的 Visual Studio 2005 项目。