⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unetmon.pas

📁 < Delphi网络通信协议分析与应用实现>>一书的源代码。
💻 PAS
字号:
unit uNetMon;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, IPHelper, IPHLPAPI, StdCtrls, ComCtrls, Buttons, Grids;

const
   version = '1.0';
type
  TIPForm = class( TForm )
    Timer1: TTimer;
    GroupBox1: TGroupBox;
    btnQuit: TSpeedButton;
    cbOnTop: TCheckBox;
    btnClear: TSpeedButton;
    btnStopCap: TSpeedButton;
    btnStartCap: TSpeedButton;
    sgMIB: TStringGrid;
    procedure Timer1Timer( Sender: TObject );
    procedure FormCreate( Sender: TObject );
    procedure btnStartCapClick(Sender: TObject);
    procedure btnStopCapClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure cbOnTopClick(Sender: TObject);
    procedure btnQuitClick(Sender: TObject);
  private
    { Private declarations }
    function GetIPFromIFIndex( InterfaceIndex: integer ): string;
    procedure InitGrid( MibArr: IpHlpAPI.TMibIFArray );
    procedure CaptureMIBData( InitFlag: boolean );
    procedure ClearCounters;
    procedure Data2Grid( MIBArr: IpHlpAPI.TMIBIFArray );
  public
    { Public declarations }
  end;

  //用于统计数据结构
  TStatistics = record
    dwInterfaceIndex: DWORD;
    ActiveCountIn,      {当前流入的数据量}
    ActiveCountOut,     {当前流出的数据量}
    PrevCountIn,        {前次流入的数据量}
    PrevCountOut,       {前次流出的数据量}
    TotalIn,            {总的流入数据量}
    TotalOut,           {总的流出数据量}
    InPerSec,           {最后一次统计的流入速度}
    OutPerSec,          {最后一次统计的流出速度}
    PeakInPerSec,       {最高的流入流出速度}
    PeakOutPerSec : DWORD;
  end;
  TStatArr = array of TStatistics;

var
  IPForm      : TIPForm;
  StatArr     : TStatArr;

implementation

{$R *.DFM}

//初始化
procedure TIPForm.FormCreate( Sender: TObject );
begin
    Caption := Caption + ' ' + Version;
    sgMib.Cells[0,0] := '网卡信息';
    sgMib.Cells[1,0] := 'MAC地址';
    sgMIB.Cells[2,0] := 'IP地址';
    sgMIB.Cells[3,0] := '流入(byte/s)';
    sgMIB.Cells[4,0] := '最高(in/s)';
    sgMIB.Cells[5,0] := '平均(in/s)';
    sgMIB.Cells[6,0] := '流出(oct/s)';
    sgMIB.Cells[7,0] := '最高(byte/s)';
    sgMIB.Cells[8,0] := '平均(out/s)';
    //设置统计间隔为1秒
    Timer1.Interval := 1000;
    CaptureMIBData( true );
end;

//关闭窗口,释放资源
procedure TIPForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Timer1.OnTimer := nil;
    Action := caFREE;
end;

procedure TIPForm.btnQuitClick(Sender: TObject);
begin
    Close;
end;

//使窗口处于最上层
procedure TIPForm.cbOnTopClick(Sender: TObject);
begin
    if cbOnTop.Checked = true then
        FormStyle := fsSTAYONTOP
    else
        FormStyle := fsNORMAL;
end;

//使用定时器统计
procedure TIPForm.Timer1Timer( Sender: TObject );
begin
    Timer1.Enabled := false;
    CaptureMIBData( false );
    Timer1.Enabled := true;
end;

//统计开始
procedure TIPForm.btnStartCapClick(Sender: TObject);
begin
    btnStartCap.Enabled := false;
    btnStopCap.Enabled  := true;
    ClearCounters;
    Timer1.Enabled := true;
end;

//统计停止
procedure TIPForm.btnStopCapClick(Sender: TObject);
begin
    btnStartCap.Enabled := true;
    btnStopCap.Enabled  := false;;
    Timer1.Enabled := false;
end;

//清除统计
procedure TIPForm.btnClearClick(Sender: TObject);
begin
    ClearCounters;
end;

//取得MIB结构的数据并初始化或显示统计
procedure TIPForm.CaptureMIBData( InitFlag: boolean );
var
    MibArr : IpHlpAPI.TMIBIfArray;
begin
    Get_IfTableMIB( MibArr );
    if InitFlag  then
        InitGrid( MibArr )
    else
        Data2Grid( MibArr );
end;

//清除统计数据
procedure TIPForm.ClearCounters;
begin
    CaptureMIBData( true );
    CaptureMIBData( false);
end;

//根据取得的信息设置表格显示信息
procedure TIPForm.Data2Grid( MIBArr: IpHlpAPI.TMIBIFArray );
var
    i : integer;
begin
    for i := low(MIBArr) to High(MIBArr) do
    with MIBArr[i] do
    begin
        with StatArr[i] do
        begin
            InPerSec  := dwInOctets - PrevCountIn;
            inc(TotalIn, InPerSec);
            if InPerSec > 0 then
                inc(ActivecountIn);
            PrevCountIn := dwInOctets;
            OutPerSec := dwOutOctets - PrevCountOut;
            inc(TotalOut,OutPerSec);
            if OutPerSec > 0 then
                inc(ActivecountOut);
            PrevCountOut  := dwOutOctets;
            if InPerSec > PeakInPerSec then
                PeakInPersec := InPersec;
            if OutPerSec > PeakOutPerSec then
                PeakOutPerSec := OutPerSec;
            //更新表格显示
            sgMIB.Cells[3, i+1] :=  IntToStr( InPerSec) ;
            sgMIB.Cells[4, i+1] :=  IntToStr( PeakInPerSec ) ;
            if ActiveCountIn > 0 then
                sgMIB.Cells[5, i+1] :=
                IntToStr( TotalIn div ActiveCountIn)
            else
                sgMIB.Cells[5, i+1] := '  --  ';
                sgMIB.Cells[6, i+1] :=  IntToStr( OutPerSec) ;
                sgMIB.Cells[7, i+1] :=  IntToStr( PeakOutPerSec) ;
            if ActiveCountOut > 0 then
                sgMIB.Cells[8, i+1] :=
                IntToStr( TotalOut div ActiveCountOut)
            else
            sgMIB.Cells[8, i+1] := '  --  ';
        end;
    end;
end;

//根据序号从列表中取得IP地址
function TIPForm.GetIPFromIFIndex( InterfaceIndex: integer ): string;
var
 i:  integer;
 IPArr : TMIBIPAddrArray;
begin
   Result := '!not_found!';
   Get_IPAddrTableMIB( IpArr );
   if Length(IPArr) > 0 then
     for i := low(IPArr) to High(IPArr) do
       if IPArr[i].dwIndex = InterfaceIndex then
       begin
         Result := IPAddr2Str(IParr[i].dwAddr);
         BREAK;
       end;
end;

//初始化统计变量与表格
procedure TIpForm.InitGrid( MibArr: IpHlpAPI.TMibIFArray );
var
    i     : integer;
    IPArr : TMibIPAddrArray;
    Descr: string;
begin
    if Length(MibArr) > 0 then
    begin
        sgMib.RowCount := succ(Length( MibArr ));
        SetLength( StatArr, Length(MibArr));
        for i := low(MIBArr) to High(MIBArr) do
        with MIBArr[i] do
        begin
            StatArr[i].ActiveCountIn := 0;
            StatArr[i].ActiveCountOut:= 0;
            StatArr[i].PrevCountIn := dwInOctets;
            StatArr[i].PrevCountOut:= dwOutOctets;
            StatArr[i].TotalIn := 0;
            StatArr[i].TotalOut:= 0;
            StatArr[i].InPerSec:= 0;
            StatArr[i].OutPerSec:= 0;
            StatArr[i].PeakInPerSec := 0;
            StatArr[i].PeakOutPerSec:=0;
            SetLength( Descr, pred(dwDescrLen));
            move(bDescr, Descr[1], pred(dwDescrLen));
            //网卡描述信息
            sgMIB.Cells[0, succ(i)] := Trim(Descr) ;
            //网卡MAC地址
            sgMIB.Cells[1, succ(i)] := MacAddr2Str( TMacAddress( bPhysAddr ), dwPhysAddrLen );
            //网卡IP地址
            sgMIB.Cells[2, succ(i)] := GetIPFromIFIndex( MIBArr[i].dwIndex);
        end;
    end;
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -