?? u_frmsearchnetip.pas
字號:
{局域網IP搜索}
unit U_FrmSearchNetIp;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
WinSock,Forms, Dialogs, RXSpin, StdCtrls, ExtCtrls, Buttons, RXSplit,
Grids, ComCtrls, RxRichEd;
const
WM_SOCK = WM_USER + 1; {自定義windows消息}
NBTPORT = 137; {向對方的137端口發數據包(UDP包)}
Type
TTGroupNet=record {網絡標識}
IP:string;
ComputerName:string;
ComputerDes:string;
NetGroup:string;
NetMacCode:string;
end;
type
TFrmSearchNetIp = class(TForm)
Panel2: TPanel;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
EdNetIP1: TEdit;
EdNetIP2: TEdit;
RxSEdDelay: TRxSpinEdit;
Panel3: TPanel;
Panel4: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
SgDispNetIP: TStringGrid;
TabSheet2: TTabSheet;
Panel5: TPanel;
Panel6: TPanel;
SBrnScanNetIP: TSpeedButton;
SBtnStopScan: TSpeedButton;
RxRedDispinf: TRxRichEdit;
LabIP: TLabel;
LabStartTime: TLabel;
LabEndTime: TLabel;
LabTime: TLabel;
Label4: TLabel;
TabSheet3: TTabSheet;
RxRichEdit1: TRxRichEdit;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SBtnStopScanClick(Sender: TObject);
procedure SBrnScanNetIPClick(Sender: TObject);
procedure SgDispNetIPSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure SgDispNetIPDblClick(Sender: TObject);
private
{ Private declarations }
procedure ReadData(var Message: TMessage); message WM_SOCK; {消息接送}
Procedure ClearGrid();
Procedure MakeGrid(Const IntIndex:integer=3);{排序}
public
{ Public declarations }
end;
{*******************************************************}
TComread=class(TThread) {通訊線程}
private
public
Tagg:integer;
protected
procedure Execute; override;
end;
{始化SOCKET}
Procedure WinSockInital(Handle: HWnd);
{關閉SOCKET}
Procedure WinSockClose();
const NbtstatPacket:array[0..49]of byte {發送數據包}
=($0,$0,$0,$0,$0,$1,
$0,$0,$0,$0,$0,$0,$20,$43,$4b,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$0,$0,$21,$0,$1);
{*******************************************************}
var
FrmSearchNetIp: TFrmSearchNetIp;
TF_stop:boolean; {停止}
TempWSAData: TWSAData;
sockfd:TSocket; {Integer socket句柄}
WAIT_ACK_EVENT:Thandle; {LongWord 句柄|}
FSockAddrIn : TSockAddrIn;
IP_count,ComputerIP:integer;
IP_end: Dword;
StartTickCount:DWORD ; {計數器}
StopTickCount: DWORD ;
TGroupNet:array of TTGroupNet;{網絡信息寄存}
IntGridCol:integer;
implementation
{$R *.DFM}
procedure TFrmSearchNetIp.FormCreate(Sender: TObject);
begin
IntGridCol:=0;
{TRxRichEdit 去除64K的限制}
RxRedDispinf.MaxLength := High(Integer) - 1024;
{Grid清除 ClearGrid}
ClearGrid;
end;
procedure TFrmSearchNetIp.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
TF_stop:=True;
setlength(TGroupNet,0);
{關閉SOCKET}
WinSockClose();
end;
{停止掃描}
procedure TFrmSearchNetIp.SBtnStopScanClick(Sender: TObject);
begin
TF_stop:=True;
end;
{****************** SOCKET通訊 *****************}
{始化SOCKET}
Procedure WinSockInital(Handle: HWnd);
begin
{ 1 初始化SOCKET}
TF_stop:=false;
if WSAStartup(2, TempWSAData)=1 then
begin
showmessage('Socket初始化出錯');
exit
end;
{若是用UDP通信,則用}
sockfd:=Socket(AF_INET,SOCK_DGRAM,0);
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(NBTPORT); {137端口}
{Socket的信息傳遞--》From.Handle 窗體, FD_READ 在讀就緒的時候, WM_SOCK 自定義消息號}
WSAAsyncSelect(sockfd, Handle , WM_SOCK, FD_READ);
{創建事件}
WAIT_ACK_EVENT:=CreateEvent(nil,true,false,pchar('WAIT_ACK') );
ResetEvent(WAIT_ACK_EVENT);
end;
{關閉SOCKET}
Procedure WinSockClose();
begin
TF_stop:=True;
CloseSocket(sockfd); {closesocket函數用來關閉一個描述符為sockfd套接字}
WSACleanup;
sleep(2);
end;
{****************** SOCKET通訊 *****************}
{掃描開始}
procedure TFrmSearchNetIp.SBrnScanNetIPClick(Sender: TObject);
var
DWx1,Dwx:Dword;
IP,Str_Ip:string;
Tcomr:TComread;
begin
RxRichEdit1.text:='';
Setlength(TGroupNet,0);
{始化SOCKET}
WinSockInital(FrmSearchNetIp.Handle);
{清除Grid}
ClearGrid;
TF_stop:=false;
IP:=trim(EdNetIP1.text);
RxRedDispinf.Text :='';
label4.Caption:='IP個數:';
LabIP.caption:='';
LabStartTime.caption:='開始時間:';
LabEndTime.caption:='結束時間:';
LabTime.caption:='掃描用時:';
if Longword(inet_addr(pchar(IP)))=INADDR_NONE then
begin
Messagebox(Application.handle,pchar(IP + ' TP 出錯'),'警告',MB_OK+MB_ICONERROR);
exit;
end;
IP:=trim(EdNetIP2.text);
if Longword(inet_addr(pchar(IP)))=INADDR_NONE then
begin
Messagebox(Application.handle,pchar(IP + ' TP 出錯'),'警告',MB_OK+MB_ICONERROR);
exit;
end;
IP:=trim(EdNetIP1.text);
ComputerIP:=inet_addr(PChar(IP)) ; // 192.168.0.1 ===>01 00 A8 C0
str_ip:=inttohex(ComputerIP,8); //01 00 A8 C0
str_ip:=copy(str_ip,7,2)+copy(str_ip,5,2)+copy(str_ip,3,2)+copy(str_ip,1,2); //==> C0 A8 00 01
DWx:=strtoint('$'+str_ip); {轉換成為一個長整形數}
str_ip:=inttohex(ComputerIP,8);
str_ip:=inttostr(strtoint('$' + copy(str_ip,7,2)))
+'.' + inttostr(strtoint('$' + copy(str_ip,5,2)))
+'.' + inttostr(strtoint('$' + copy(str_ip,3,2)))
+'.' + inttostr(strtoint('$' + copy(str_ip,1,2)));
EdNetIP1.text:=str_ip; {允許輸入 一個數值表示IP}
IP:=trim(EdNetIP2.text);
ComputerIP:=inet_addr(PChar(IP)) ; // 192.168.0.1 ===>01 00 A8 C0
str_ip:=inttohex(ComputerIP,8); //01 00 A8 C0
str_ip:=copy(str_ip,7,2)+copy(str_ip,5,2)+copy(str_ip,3,2)+copy(str_ip,1,2); //==> C0 A8 00 01
DWx1:=strtoint('$'+str_ip); {轉換成為一個長整形數}
str_ip:=inttohex(ComputerIP,8);
str_ip:=inttostr(strtoint('$' + copy(str_ip,7,2)))
+'.' + inttostr(strtoint('$' + copy(str_ip,5,2)))
+'.' + inttostr(strtoint('$' + copy(str_ip,3,2)))
+'.' + inttostr(strtoint('$' + copy(str_ip,1,2)));
EdNetIP2.text:=str_ip; {允許輸入 一個數值表示IP}
if DWx1>Dwx then
begin
IP_count:=DWx1-Dwx;
ComputerIP:=inet_addr(PChar(trim(EdNetIP1.text)));
IP_end:=DWx1;
label1.caption:='-->>';
end
else begin
IP_count:=DWx-Dwx1;
ComputerIP:=inet_addr(PChar(trim(EdNetIP2.text)));
IP_end:=DWx;
label1.caption:='<<--';
end;
SBrnScanNetIP.Enabled :=false; {屏蔽按鍵}
Tcomr:=TComread.Create(True);
StartTickCount:=GetTickCount;
LabStartTime.caption:='開始時間:' + FloatToStr(StartTickCount);
Tcomr.Resume ; {開始線程}
end;
{ TComread }
{通訊線程}
procedure TComread.Execute;
var
str_ip:string;
IP_now:Dword;
Procedure MakeEnd();
begin
FrmSearchNetIp.SBrnScanNetIP.Enabled :=True;
StopTickCount:=GetTickCount;
FrmSearchNetIp.LabEndTime.caption:='結束時間:' +FloatToStr(StopTickCount);
FrmSearchNetIp.LabTime.caption:='掃描用時:' +FloatToStr(StopTickCount-startTickCount)+' mS';
FrmSearchNetIp.label4.Caption:='IP個數:'+ inttostr(FrmSearchNetIp.SgDispNetIP.RowCount-1);
FrmSearchNetIp.MakeGrid(3);
{排序
'TP地址'0 '計算機名稱'1 '計算機描述' 2
'網絡組'3 '網卡MAC碼'4
MakeGrid(const IntIndex: integer=3);}
end;
begin
with FrmSearchNetIp do
begin
str_ip:=inttohex(ComputerIP,8); //01 00 A8 C0
str_ip:=copy(str_ip,7,2)+copy(str_ip,5,2)+copy(str_ip,3,2)+copy(str_ip,1,2); //==> C0 A8 00 01
IP_now:=strtoint('$'+str_ip);
while IP_end>=IP_now do ////IP_end==> C0 A8 00 01
begin
if TF_stop=True then
begin
MakeEnd();
{關閉SOCKET}
WinSockClose();
exit;
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -