📄 uupdscanthread.pas
字号:
unit UUPDScanThread;
interface
uses
Classes,SysUtils,Forms,UIPMacManager;
type
TUPDScanThread = class(TThread)
private
FSocket: TSocket;
Socketaddr: TSockAddr;
FSockAddrIn : TSockAddrIn; //利用消息实时获知UDP消息
procedure LogToFile;
procedure Log;
procedure ShowCount;
procedure ReadData(var Message: TMessage); message WM_SOCK;
public
ScanIPs:string;
DestIP:string;//需要检查的IP地址
DestMac:string;//Mac地址结果
constructor Create(const aIP: string;aCreateSuspended:boolean=true;aFreeOnTerminate:boolean=true);
destructor Destroy; override;
protected
procedure Execute; override;
end;
var ThreadCount:integer=0;
ThreadStop:boolean=false;
implementation
uses UMacFunction,UMainForm;
{ TScanThread }
constructor TUPDScanThread.Create(const aIP: string;aCreateSuspended:boolean=true;aFreeOnTerminate:boolean=true);
begin
inherited Create(aCreateSuspended);
ScanIPs:=aIP;
DestIP:=aIP;
FreeOnTerminate:=aFreeOnTerminate;
inc(ThreadCount);
Resume;
end;
destructor TUPDScanThread.Destroy;
begin
//dec(ThreadCount);
inherited Destroy;
end;
function StrToTstr(OriginStr:String;DestTstr:TstringList;Splitter:String =','):Integer;
var
i,iRet:integer;
tmpStr:String;
begin
tmpStr:='';
iRet:=0;
DestTStr.Clear;
for i:=1 to length(OriginStr) do
begin
if (OriginStr[i]<>Splitter) then
tmpStr:=tmpStr+OriginStr[i];
if OriginStr[i]=Splitter then
if tmpStr<>'' then
begin
DestTStr.Add(tmpStr);
iRet:=iRet+1;
tmpStr:='';
end;
end;
if tmpStr<>'' then
begin
DestTStr.Add(tmpStr);
iRet:=iRet+1;
tmpStr:='';
end;
Result:=iRet;
end;
procedure TUPDScanThread.Execute;
var IPList:TstringList;
Index:integer;
OnLine:boolean;
begin
Synchronize(ShowCount);
IPList:=TstringList.Create;
StrToTstr(ScanIPs,IPList,',');
Index:=0;
try
while (not ThreadStop and not self.Terminated) and (Index<IPList.Count) do
begin
DestIP:=IPList[Index];
inc(Index);
if(DestIP='') then Continue;
DestMac:=Uppercase(UMacFunction.GetMacByIp(DestIP));
OnLine:=DestMac<>'';
IPMacManager.OnLineModify(DestIP,OnLine);
if(OnLine) then
begin
Synchronize(Log);
Synchronize(LogToFile);
end;
end;
finally
IPList.free;
self.Terminate;
dec(ThreadCount);
Synchronize(ShowCount);
end;
end;
procedure TUPDScanThread.LogToFile;
var Mac:string;
begin
if(IPMacManager=nil) then
Exit;
Mac:=Uppercase(IPMacManager.FindByIP(DestIP));
if Pos(DestMac,Mac)<=0 then
IPMacManager.AddMac(DestIP,DestMac);
end;
procedure TUPDScanThread.Log;
begin
MainForm.LogStr('ScanThread ['+DestIP+'] = '+DestMac);
end;
procedure TUPDScanThread.ShowCount;
begin
MainForm.Caption:='定时检查Mac地址 ThreadCount='+inttostr(ThreadCount);
end;
procedure TUPDScanThread.ScanIP_UDP(IP:string;b:array of byte);
begin
FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(IP));
sendto(FSocket, b[0],50, 0, FSockAddrIn, sizeof(FSockAddrIn));
end;
procedure TUPDScanThread.InitSocket;
var TempWSAData: TWSAData;
begin
// 初始化SOCKET
if WSAStartup($101, TempWSAData)=1 then
;//showmessage('StartUp Error!');
FSocket := Socket(AF_INET, SOCK_DGRAM, 0);
if (FSocket = INVALID_SOCKET) then //Socket创建失败
begin
//showmessage(inttostr(WSAGetLastError())+' Socket创建失败');
CloseSocket(FSocket);
end;
//本机SockAddr绑定
Socketaddr.sin_family := AF_INET;
Socketaddr.sin_addr.S_addr := INADDR_ANY;
Socketaddr.sin_port := htons(UDPPORT);
if Bind(FSocket, Socketaddr, sizeof(Socketaddr)) <> 0 then
begin
//showmessage('bind fail');
end;
WSAAsyncSelect(FSocket, self.Handle , WM_SOCK, FD_READ);
//对方SockAddrIn设定
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(NBTPORT);
end;
procedure TUPDScanThread.ReadData(var Message: TMessage);
var
buffer: Array [1..500] of byte;
len: integer;
flen: integer;
Event: word;
IP,Mac,GroupHostName,tmp: string;
iPos,NameNum:integer;
begin
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(NBTPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := recvfrom(FSocket, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
if len<> 0 then
begin
try
IP:=inet_ntoa(FSockAddrIn.SIn_Addr);
GetInfo(buffer,len,iPos,NameNum);
Mac:=GetMac(buffer,iPos,NameNum);
tmp:=Uppercase(IPMacManager.FindByIP(IP));
if Pos(Mac,tmp)<=0 then
IPMacManager.AddMac(IP,Mac);
GroupHostName:=GetGroupHostName(buffer,iPos,NameNum);
if(IP<>'') and (GroupHostName<>'') then
IPMacManager.NameModify(Mac,IP,GroupHostName);
LogStr(#13+'ScanThread ['+IP+'] = '+Mac+#13+' '+GroupHostName);
//LogStr(' '+GroupHostName);
//LogStr('ScanThread ['+IP+'] = '+Mac);
except
On Ex:Exception do
memo1.Lines.Insert(0,Ex.Message);
end;
end;
end;
application.ProcessMessages;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -