📄 unetmon.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 + -