📄 scanipunit.pas
字号:
unit ScanIPUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Mask, Spin, Buttons,
Gauges,StrUtils,SyncObjs, IdBaseComponent, IdComponent, IdIPWatch, Menus,
ImgList;
type
TScanIPFm = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Splitter1: TSplitter;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Label1: TLabel;
Label2: TLabel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
Panel4: TPanel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
SpinButton1: TSpinButton;
Panel5: TPanel;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
SpinButton2: TSpinButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
Gauge2: TGauge;
Gauge3: TGauge;
RadioGroup1: TRadioGroup;
Label3: TLabel;
Edit9: TEdit;
RadioGroup2: TRadioGroup;
Panel6: TPanel;
Label4: TLabel;
Edit10: TEdit;
Label5: TLabel;
Edit11: TEdit;
Label6: TLabel;
Edit12: TEdit;
Gauge1: TGauge;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
Panel7: TPanel;
TreeView1: TTreeView;
Panel8: TPanel;
Timer1: TTimer;
Label7: TLabel;
Label8: TLabel;
Gauge4: TGauge;
SpinEdit1: TSpinEdit;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Panel9: TPanel;
ListView1: TListView;
Panel22: TPanel;
Panel10: TPanel;
Panel11: TPanel;
SpeedButton9: TSpeedButton;
Panel12: TPanel;
SpeedButton11: TSpeedButton;
SpeedButton12: TSpeedButton;
SpeedButton13: TSpeedButton;
SpeedButton15: TSpeedButton;
SaveDialog1: TSaveDialog;
ComboBox1: TComboBox;
Label12: TLabel;
IdIPWatch1: TIdIPWatch;
PopupMenu1: TPopupMenu;
PopupMenu2: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
ImageList1: TImageList;
Gauge5: TGauge;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
procedure RadioGroup1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure Edit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit3KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit4KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit5KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit6KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit7KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit8KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpinButton1UpClick(Sender: TObject);
procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Edit5MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SpinButton1DownClick(Sender: TObject);
procedure SpinButton2DownClick(Sender: TObject);
procedure SpinButton2UpClick(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure SpeedButton15Click(Sender: TObject);
procedure SpeedButton11Click(Sender: TObject);
procedure ListView1Click(Sender: TObject);
procedure SpeedButton13Click(Sender: TObject);
procedure RadioGroup2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure SpeedButton7Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure SpeedButton12Click(Sender: TObject);
private
{ Private declarations }
public
FromA_IP,ToA_IP : Byte;
FromB_IP,ToB_IP : Byte;
FromC_IP,ToC_IP : Byte;
FromD_IP,ToD_IP : Byte;
procedure FillLocalIP;
procedure GetTheScanIP;
procedure PingPorcess;
Procedure ScanPortPorcess;
procedure SingleHostScan;
procedure SingleHostScan2;
procedure MultiHostScan;
end;
var
ScanIPFm : TScanIPFm;
OldEditText : String;
FromEdit : TEdit;
ToEdit : TEdit;
LetPingSingle: TCriticalSection;
LetScanSingle: TCriticalSection;
SdPingCount : Integer;
SdScanCount : integer;
MultiPingCount:integer;
MultiScanCount:integer;
implementation
uses
PingThreadUnit,ScanPortThreadUnit,ScanHostPortThreadUnit, UserInfo;
{$R *.dfm}
procedure TScanIPFm.GetTheScanIP;
begin
FromA_IP:=StrToInt(Edit1.Text) ; ToA_IP:= StrToInt(Edit5.Text);
FromB_IP:=StrToInt(Edit2.Text) ; ToB_IP:= StrToInt(Edit6.Text);
FromC_IP:=StrToInt(Edit3.Text) ; ToC_IP:= StrToInt(Edit7.Text);
FromD_IP:=StrToInt(Edit4.Text) ; ToD_IP:= StrToInt(Edit8.Text);
end;
procedure TScanIPFm.FillLocalIP;
var
i:integer;
TheIndex:integer;
TheIPStr:string;
begin
try
TheIPStr:=ComboBox1.Text;
For i:=1 to Length(TheIPStr) do
begin
if TheIPStr[i]='.' then
begin
TheIndex:=i;
Edit1.Text:=StrUtils.leftStr(TheIPStr,TheIndex-1);
Edit5.Text:=Edit1.Text;
TheIPStr:=StrUtils.RightStr(TheIPStr,Length(TheIPStr)-TheIndex);
break;
end;
end;
For i:=1 to Length(TheIPStr) do
begin
if TheIPStr[i]='.' then
begin
TheIndex:=i;
Edit2.Text:=StrUtils.leftStr(TheIPStr,TheIndex-1);
Edit6.Text:=Edit2.Text;
TheIPStr:=StrUtils.RightStr(TheIPStr,Length(TheIPStr)-TheIndex);
break;
end;
end;
For i:=1 to Length(TheIPStr) do
begin
if TheIPStr[i]='.' then
begin
TheIndex:=i;
Edit3.Text:=StrUtils.leftStr(TheIPStr,TheIndex-1);
Edit7.Text:=Edit3.Text;
TheIPStr:=StrUtils.RightStr(TheIPStr,Length(TheIPStr)-TheIndex);
break;
end;
end;
Edit4.Text:=TheIPStr;
Edit8.Text:=TheiPStr;
except
end;
end;
procedure TScanIPFm.PingPorcess;
var
iA,iB,iC,iD:integer;
ThePingIP:String;
ThePingThread:PingThread;
TheTimeStr :String;
TotalCount:int64;
begin
if SdPingCount>0 then exit;
Timer1.Enabled:=True;
TotalCount:=0;
GetTheScanIP;
TheTimeStr:=TimeToStr(Time);
For iA:=FromA_IP To ToA_IP do
For iB:=FromB_IP To ToB_IP do
For iC:=FromC_IP To ToC_IP do
For iD:=FromD_IP To ToD_IP do
begin
TotalCount:=TotalCount+1;
end;
Gauge4.MaxValue:=MultiPingCount;
Gauge2.Progress:=0;
try
Gauge2.MaxValue:=TotalCount;
except
beep;
SpeedButton6.Down:=True;
Panel10.Caption:='搜索初始化错误!';
Timer1.Enabled:=False;
exit;
end;
For iA:=FromA_IP To ToA_IP do
For iB:=FromB_IP To ToB_IP do
For iC:=FromC_IP To ToC_IP do
For iD:=FromD_IP To ToD_IP do
begin
ThePingIP:=IntToStr(iA)+'.'+IntToStr(iB)+'.'+
IntToStr(iC)+'.'+IntToStr(iD);
Edit1.Text:=IntToStr(iA);
Edit2.Text:=IntToStr(iB);
Edit3.Text:=IntToStr(iC);
Edit4.Text:=IntToStr(iD);
Repeat //设置阻塞操作
Application.ProcessMessages;
Gauge4.Progress:=SdPingCount;
Panel10.Caption:='当前共发出'+IntToStr(SdPingCount)+'个搜索线程';
if SpeedButton6.Down then
begin
Repeat
Application.ProcessMessages;
Gauge4.Progress:=SdPingCount;
Panel10.Caption:='当前还有'+IntToStr(SdPingCount)
+'个搜索线程未返回,请稍候...';
until SdPingCount=0;
SpeedButton6.Down:=True;
Timer1.Enabled:=False;
Gauge4.Progress:=0;
TheTimeStr:='扫描时间从:'+TheTimeStr+' 到:'+TimeToStr(Time);
Application.MessageBox(PChar(TheTimeStr),'扫描中断',
MB_OK+MB_ICONSTOP);
Panel10.Caption:='搜索线程已经全部返回_____OK!';
exit;
end;
until SdPingCount<MultiPingCount;
try
ThePingThread:=PingThread.Create(ThePingIP,ListView1);
except
beep;
SpeedButton6.Down:=True;
Panel10.Caption:='搜索线程创建错误错误!';
end;
Gauge2.Progress:=Gauge2.Progress+1;
end;
Repeat
Application.ProcessMessages;
Gauge4.Progress:=SdPingCount;
Panel10.Caption:='当前还有'+IntToStr(SdPingCount)
+'个搜索线程未返回,请稍候...';
until SdPingCount=0;
SpeedButton6.Down:=True;
Timer1.Enabled:=False;
TheTimeStr:='扫描时间从:'+TheTimeStr+' 到:'+TimeToStr(Time);
Panel10.Caption:='搜索线程已经全部返回_____OK!';
Gauge4.Progress:=0;
Application.MessageBox(PChar(TheTimeStr),'扫描完毕',
MB_OK+MB_ICONINFORMATION);
end;
Procedure TScanIPFm.ScanPortPorcess;
var
iA,iB,iC,iD:integer;
ThePingIP:String;
TheScanThread:ScanPortThread;
TheTimeStr :String;
TotalCount:int64;
begin
if SdPingCount>0 then exit;
Timer1.Enabled:=True;
TotalCount:=0;
GetTheScanIP;
TheTimeStr:=TimeToStr(Time);
For iA:=FromA_IP To ToA_IP do
For iB:=FromB_IP To ToB_IP do
For iC:=FromC_IP To ToC_IP do
For iD:=FromD_IP To ToD_IP do
begin
TotalCount:=TotalCount+1;
end;
Gauge4.MaxValue:=MultiPingCount;
Gauge2.Progress:=0;
try
Gauge2.MaxValue:=TotalCount;
except
beep;
SpeedButton6.Down:=True;
Panel10.Caption:='搜索初始化错误!';
Timer1.Enabled:=False;
exit;
end;
For iA:=FromA_IP To ToA_IP do
For iB:=FromB_IP To ToB_IP do
For iC:=FromC_IP To ToC_IP do
For iD:=FromD_IP To ToD_IP do
begin
ThePingIP:=IntToStr(iA)+'.'+IntToStr(iB)+'.'+
IntToStr(iC)+'.'+IntToStr(iD);
Edit1.Text:=IntToStr(iA);
Edit2.Text:=IntToStr(iB);
Edit3.Text:=IntToStr(iC);
Edit4.Text:=IntToStr(iD);
Repeat //设置阻塞操作
Application.ProcessMessages;
Gauge4.Progress:=SdPingCount;
Panel10.Caption:='当前共发出'+IntToStr(SdPingCount)+'个搜索线程';
if SpeedButton6.Down then
begin
Repeat
Application.ProcessMessages;
Gauge4.Progress:=SdPingCount;
Panel10.Caption:='当前还有'+IntToStr(SdPingCount)
+'个搜索线程未返回,请稍候...';
until SdPingCount=0;
SpeedButton6.Down:=True;
Timer1.Enabled:=False;
Gauge4.Progress:=0;
TheTimeStr:='扫描时间从:'+TheTimeStr+' 到:'+TimeToStr(Time);
Application.MessageBox(PChar(TheTimeStr),'扫描中断',
MB_OK+MB_ICONSTOP);
Panel10.Caption:='搜索线程已经全部返回_____OK!';
exit;
end;
until SdPingCount<MultiPingCount;
try
TheScanThread:=ScanPortThread.Create(ThePingIP,
StrToInt(Edit9.Text),ListView1);
except
beep;
SpeedButton6.Down:=True;
Panel10.Caption:='搜索线程创建错误错误!';
end;
Gauge2.Progress:=Gauge2.Progress+1;
end;
Repeat
Application.ProcessMessages;
Gauge4.Progress:=SdPingCount;
Panel10.Caption:='当前还有'+IntToStr(SdPingCount)
+'个搜索线程未返回,请稍候...';
until SdPingCount=0;
SpeedButton6.Down:=True;
Timer1.Enabled:=False;
TheTimeStr:='扫描时间从:'+TheTimeStr+' 到:'+TimeToStr(Time);
Panel10.Caption:='搜索线程已经全部返回_____OK!';
Gauge4.Progress:=0;
Application.MessageBox(PChar(TheTimeStr),'扫描完毕',
MB_OK+MB_ICONINFORMATION);
end;
procedure TScanIPFm.SingleHostScan;
var
i:integer;
ThePortScan:ScanHostPortThread;
TheNewNode:TTreeNode;
FromPort,ToPort:integer;
begin
if SdScanCount<>0 then exit;
TheNewNode:=TreeView1.Items.Add(nil,Edit10.Text);
TheNewNode.ImageIndex:=0;
TheNewNode.StateIndex:=0;
TheNewNode.SelectedIndex:=0;
Gauge1.MaxValue:=StrToInt(Edit12.Text);
Gauge1.Progress:=0;
Gauge5.MaxValue:=MultiScanCount;
Gauge5.Progress:=0;
FromPort:=StrToInt(Edit11.text);
ToPort:=StrToInt(Edit12.text);
For i:=FromPort To ToPort do
begin
repeat
Application.ProcessMessages;
Gauge5.Progress:=SdScanCount;
if SpeedButton8.Down then
begin
repeat
Application.ProcessMessages;
Gauge5.Progress:=SdScanCount;
until SdScanCount=0;
Application.MessageBox('===扫描由您主动结束===','扫描中断',
MB_OK+MB_ICONSTOP);
Gauge5.Progress:=0;
exit;
end;
until SdScanCount<MultiScanCount;
Gauge1.Progress:=i;
Gauge5.Progress:=SdScanCount;
Panel8.Caption:='扫描'+Edit10.Text+':'+IntToStr(i);
Try
ThePortScan:=ScanHostPortThread.Create(Edit10.Text,i,TreeView1);
except
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -