65.9K
CodeProject 正在变化。 阅读更多。
Home

Ping 监视器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (23投票s)

2007年7月4日

5分钟阅读

viewsIcon

212868

downloadIcon

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` 标志未设置为“是”)。

Screenshot - config.jpg

`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 文件以检索

  1. 到配置数据库的连接字符串(请参阅 `ConnStr` appSetting)
  2. 配置重载频率(请参阅 `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'` 的主机的最后一条记录。

Screenshot - monitor.jpg

`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 项目。
© . All rights reserved.