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
end;
end;
repeat
Application.ProcessMessages;
Gauge5.Progress := SdScanCount;
until SdScanCount = 0;
SpeedButton8.Down := True;
Gauge5.Progress := 0;
Application.MessageBox('===扫描任务完成!===', '扫描完毕',
MB_OK + MB_ICONSTOP);
end;
procedure TScanIPFm.SingleHostScan2;
var
i: integer;
ThePortScan: ScanHostPortThread;
FromPort, ToPort: integer;
begin
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
end;
end;
repeat
Application.ProcessMessages;
Gauge5.Progress := SdScanCount;
until SdScanCount = 0;
Gauge5.Progress := 0;
end;
procedure TScanIPFm.MultiHostScan;
var
i: integer;
TheNewNode: TTreeNode;
begin
SdScanCount := 0;
for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].Checked then
begin
Edit10.Text := ListView1.Items[i].Caption;
TheNewNode := TreeView1.Items.Add(nil, Edit10.Text);
TheNewNode.ImageIndex := 0;
TheNewNode.StateIndex := 0;
TheNewNode.SelectedIndex := 0;
repeat
Application.ProcessMessages;
if SpeedButton8.Down then exit;
until SdScanCount = 0;
SingleHostScan2;
end;
end;
Application.MessageBox('===扫描任务完成!===', '扫描完毕',
MB_OK + MB_ICONSTOP);
SpeedButton8.Down := True;
end;
procedure TScanIPFm.RadioGroup1Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex = 0 then
Edit9.Enabled := False
else
Edit9.Enabled := True;
end;
procedure TScanIPFm.Timer1Timer(Sender: TObject);
var
MidColor: TColor;
begin
Gauge3.Progress := Gauge3.Progress + 10;
if Gauge3.Progress = 100 then
begin
Gauge3.Progress := 0;
MidColor := Gauge3.BackColor;
Gauge3.BackColor := Gauge3.ForeColor;
Gauge3.ForeColor := MidColor;
end;
end;
procedure TScanIPFm.SpeedButton5Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex = 1 then
ScanPortPorcess
else
PingPorcess;
end;
procedure TScanIPFm.SpeedButton6Click(Sender: TObject);
begin
Timer1.Enabled := false;
end;
procedure TScanIPFm.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit2.SetFocus;
Edit5.Text := Edit1.Text;
end;
procedure TScanIPFm.FormCreate(Sender: TObject);
begin
OldEditText := '0';
SdPingCount := 0;
SdScanCount := 0;
MultiPingCount := 100;
MultiScanCount := 100;
LetPingSingle := TCriticalSection.Create;
LetScanSingle := TCriticalSection.Create;
end;
procedure TScanIPFm.Edit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit3.SetFocus;
Edit6.Text := Edit2.Text;
end;
procedure TScanIPFm.Edit3KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit4.SetFocus;
Edit7.Text := Edit3.Text;
end;
procedure TScanIPFm.Edit4KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit5.SetFocus;
end;
procedure TScanIPFm.Edit5KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit6.SetFocus;
end;
procedure TScanIPFm.Edit6KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit7.SetFocus;
end;
procedure TScanIPFm.Edit7KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit8.SetFocus;
end;
procedure TScanIPFm.Edit8KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 8 then exit;
if (48 <= Key) and (Key <= 57) then
begin
if StrToInt((Sender as TEdit).Text) > 255 then
(Sender as TEdit).Text := '255';
end
else
(Sender as TEdit).Text := OldEditText;
OldEditText := (Sender as TEdit).Text;
if Key = 190 then Edit1.SetFocus;
end;
procedure TScanIPFm.SpeedButton4Click(Sender: TObject);
begin
Edit4.Text := '0';
Edit8.Text := '255';
end;
procedure TScanIPFm.SpeedButton3Click(Sender: TObject);
begin
Edit3.Text := '0';
Edit7.Text := '255';
end;
procedure TScanIPFm.SpeedButton2Click(Sender: TObject);
begin
Edit2.Text := '0';
Edit6.Text := '255';
end;
procedure TScanIPFm.SpeedButton1Click(Sender: TObject);
begin
Edit1.Text := '0';
Edit5.Text := '255';
end;
procedure TScanIPFm.SpinButton1UpClick(Sender: TObject);
begin
if StrToInt(FromEdit.Text) + 1 > 255 then exit;
if FromEdit <> nil then
FromEdit.Text := IntToStr(StrToInt(FromEdit.Text) + 1);
end;
procedure TScanIPFm.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FromEdit := (Sender as TEdit);
end;
procedure TScanIPFm.Edit5MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ToEdit := (Sender as TEdit)
end;
procedure TScanIPFm.SpinButton1DownClick(Sender: TObject);
begin
if StrToInt(FromEdit.Text) - 1 < 0 then exit;
if FromEdit <> nil then
FromEdit.Text := IntToStr(StrToInt(FromEdit.Text) - 1);
end;
procedure TScanIPFm.SpinButton2DownClick(Sender: TObject);
begin
if StrToInt(ToEdit.Text) - 1 < 0 then exit;
if ToEdit <> nil then
ToEdit.Text := IntToStr(StrToInt(ToEdit.Text) - 1);
end;
procedure TScanIPFm.SpinButton2UpClick(Sender: TObject);
begin
if StrToInt(ToEdit.Text) + 1 > 255 then exit;
if ToEdit <> nil then
ToEdit.Text := IntToStr(StrToInt(ToEdit.Text) + 1);
end;
procedure TScanIPFm.Edit1Change(Sender: TObject);
begin
if (Sender as TEdit).Text = '' then (Sender as TEdit).Text := '0';
end;
procedure TScanIPFm.FormDestroy(Sender: TObject);
begin
LetPingSingle.Free;
LetScanSingle.Free;
end;
procedure TScanIPFm.Edit2Change(Sender: TObject);
begin
if (Sender as TEdit).Text = '' then (Sender as TEdit).Text := '0';
end;
procedure TScanIPFm.Edit3Change(Sender: TObject);
begin
if (Sender as TEdit).Text = '' then (Sender as TEdit).Text := '0';
end;
procedure TScanIPFm.SpinEdit1Change(Sender: TObject);
begin
MultiPingCount := SpinEdit1.Value;
MultiScanCount := SpinEdit1.Value;
end;
procedure TScanIPFm.ListView1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
ListView1.Hint := '共搜索到' + IntToStr(ListView1.Items.Count) + '个';
end;
procedure TScanIPFm.SpeedButton15Click(Sender: TObject);
begin
Close;
end;
procedure TScanIPFm.SpeedButton11Click(Sender: TObject);
begin
ListView1.Items.Clear;
Panel10.Caption := '扫描结果已全部清除';
end;
procedure TScanIPFm.ListView1Click(Sender: TObject);
begin
if ListView1.Selected <> nil then
SpeedButton12.Enabled := True
else
SpeedButton12.Enabled := False;
if ListView1.Selected <> nil then
Edit10.Text := ListView1.Selected.Caption;
end;
procedure TScanIPFm.SpeedButton13Click(Sender: TObject);
var
SaveList: TStringList;
i: integer;
begin
if SaveDialog1.Execute then
begin
SaveList := TStringList.Create;
for i := 0 to ListView1.Items.Count - 1 do
SaveList.Add(ListView1.Items[i].Caption);
SaveList.SaveToFile(SaveDialog1.FileName);
Savelist.Free;
end;
end;
procedure TScanIPFm.RadioGroup2Click(Sender: TObject);
begin
if RadioGroup2.ItemIndex = 0 then
Edit10.Enabled := True
else
Edit10.Enabled := False;
end;
procedure TScanIPFm.FormShow(Sender: TObject);
begin
IdIPWatch1.Active := True;
ComboBox1.Text := IdIPWatch1.CurrentIP;
ComboBox1.Items.Text := IdIPWatch1.IPHistoryList.Text;
IdIPWatch1.Active := False;
FillLocalIP;
FromEdit := Edit4;
ToEdit := Edit8;
end;
procedure TScanIPFm.N2Click(Sender: TObject);
begin
if ListView1.Selected <> nil then
ListView1.Selected.Delete;
end;
procedure TScanIPFm.N3Click(Sender: TObject);
begin
if ListView1.Selected <> nil then
ListView1.Items.Clear;
end;
procedure TScanIPFm.SpeedButton7Click(Sender: TObject);
begin
if RadioGroup2.ItemIndex = 0 then
SingleHostScan
else
MultiHostScan;
end;
procedure TScanIPFm.N4Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to ListView1.Items.Count - 1 do
ListView1.Items[i].Checked := True;
end;
procedure TScanIPFm.N5Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to ListView1.Items.Count - 1 do
ListView1.Items[i].Checked := False;
end;
procedure TScanIPFm.N6Click(Sender: TObject);
begin
if TreeView1.Selected <> nil then
TreeView1.Selected.Delete;
end;
procedure TScanIPFm.N7Click(Sender: TObject);
begin
TreeView1.Items.Clear;
end;
procedure TScanIPFm.N1Click(Sender: TObject);
begin
if ListView1.Selected <> nil then
begin
UserForm.MaskEdit2.Text := ListView1.Selected.Caption;
UserForm.ComboBox1.Enabled := True;
UserForm.ShowModal;
UserForm.ComboBox1.Enabled := False;
end;
end;
procedure TScanIPFm.SpeedButton12Click(Sender: TObject);
begin
N1Click(self);
end;
end.
unit PingThreadUnit;
interface
uses
Classes, IdIcmpClient, SysUtils, ComCtrls, IdStackConsts;
type
PingThread = class(TThread)
private
{ Private declarations }
protected
EchoCount: integer;
SaveTL: TListView;
PingTheIP: string;
MyIcmpClient: TIdIcmpClient;
TheMaxEchoTime: integer;
TheEchoTTl: byte;
TheEchoStr: string;
procedure SaveIP;
procedure PingFiveIP;
procedure MyIdIcmpClientReply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
procedure Execute; override;
public
constructor Create(TheIP: string; TheTL: TListView);
destructor Destroy; override;
end;
implementation
uses ScanIPUnit;
constructor PingThread.Create(TheIP: string; TheTL: TListView);
begin
inherited Create(True);
self.FreeOnTerminate := True;
EchoCount := 0;
PingTheIP := TheIP;
SaveTL := TheTL;
MyIcmpClient := TIdIcmpClient.Create(nil);
MyIcmpClient.Protocol := 1;
MyIcmpClient.ReceiveTimeout := 5000;
MyIcmpClient.OnReply := MyIdIcmpClientReply;
LetPingSingle.Enter;
SdPingCount := SdPingCount + 1;
LetPingSingle.Leave;
TheMaxEchoTime := 0;
TheEchoTTl := 0;
self.Suspended := False;
end;
procedure PingThread.SaveIP;
var
TheListItem: TListItem;
begin
try
TheListItem := SaveTL.Items.Add;
TheListItem.ImageIndex := 0;
TheListItem.Caption := PingTheIP;
TheLIstItem.SubItems.Add(IntToStr((EchoCount * 100) div 5) + '%');
TheLIstItem.SubItems.Add(IntToStr(TheMaxEchoTime) + '''ms');
TheLIstItem.SubItems.Add(IntToStr(TheEchoTTL));
TheLIstItem.SubItems.Add(TheEchoStr);
except
end;
end;
procedure PingThread.PingFiveIP;
var
i: integer;
begin
MyIcmpClient.Host := PingTheIP;
for i := 1 to 5 do
MyIcmpClient.Ping;
end;
procedure PingThread.Execute;
begin
try
PingFiveIP;
except
self.Terminate;
end;
end;
procedure PingThread.MyIdIcmpClientReply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
try
TheMaxEchoTime := TheMaxEchoTime + AReplyStatus.MsRoundTripTime;
TheEchoStr := IntToStr(AReplyStatus.BytesReceived) + '字节';
TheEchoTTl := AReplyStatus.TimeToLive;
if (AReplyStatus.ReplyStatusType = rsEcho) then
if (AReplyStatus.FromIpAddress = PingTheIP) then
EchoCount := EchoCount + 1;
except
end;
end;
destructor PingThread.Destroy;
begin
try
if EchoCount > 0 then
Synchronize(SaveIP);
except
end;
MyIcmpClient.Free;
LetPingSingle.Enter;
SdPingCount := SdPingCount - 1;
LetPingSingle.Leave;
inherited Destroy;
end;
end.
unit ScanPortThreadUnit;
interface
uses
Classes, IdTCPClient, SysUtils, ComCtrls, IdSocks;
type
ScanPortThread = class(TThread)
private
{ Private declarations }
protected
SaveTL: TListView;
ScanTheIP: string;
ScanThePort: integer;
MyTcpClient: TIdTcpClient;
//TheScktInfo:TSocksInfo;
procedure SaveIP;
procedure Execute; override;
public
constructor Create(TheIP: string; ThePort: integer; TheTL: TListView);
destructor Destroy; override;
end;
implementation
uses ScanIPUnit;
constructor ScanPortThread.Create(TheIP: string; ThePort: integer; TheTL:
TListView);
begin
inherited Create(True);
self.FreeOnTerminate := True;
ScanTheIP := TheIP;
ScanThePort := ThePort;
SaveTL := TheTL;
MyTcpClient := TIdTcpClient.Create(nil);
//TheScktInfo:=TSocksInfo.Create;
LetPingSingle.Enter;
SdPingCount := SdPingCount + 1;
LetPingSingle.Leave;
self.Suspended := False;
end;
procedure ScanPortThread.Execute;
begin
//TheScktInfo.Authentication:=saNoAuthentication;
//TheScktInfo.Version:=svNoSocks;
//TheScktInfo.Port:=0;
//MyTcpClient.SocksInfo:=TheScktInfo;
//MyTcpClient.UseNagle:=True;
MyTcpClient.Host := ScanTheIP;
MyTcpClient.Port := ScanThePort;
try
MyTcpClient.Connect;
except
end;
if MyTcpClient.Connected then
begin
Synchronize(SaveIP);
MyTcpClient.Disconnect;
end;
Self.Terminate;
end;
procedure ScanPortThread.SaveIP;
var
TheListItem: TListItem;
begin
try
TheListItem := SaveTL.Items.Add;
TheListItem.ImageIndex := 0;
TheListItem.Caption := ScanTheIP;
TheLIstItem.SubItems.Add('0');
TheLIstItem.SubItems.Add('0');
TheLIstItem.SubItems.Add('0');
TheLIstItem.SubItems.Add('0');
TheLIstItem.SubItems.Add(IntToStr(ScanThePort));
except
end;
end;
destructor ScanPortThread.Destroy;
begin
MyTcpClient.Free;
//TheScktInfo.Free;
LetPingSingle.Enter;
SdPingCount := SdPingCount - 1;
LetPingSingle.Leave;
inherited Destroy;
end;
end.