⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uupdscanthread.pas

📁 定时扫描局域网络中的电脑的Mac地址情况
💻 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 + -