查找MAC地址,用来搜索IPort的。

unit UMacSearch ;

interface

uses Windows,Registry,SysUtils,StrUtils,winsock,Classes,Contnrs,Dialogs,uMyFunc;

const Max_Machine=8;

type
  RecIpAndMac= record
  IPAddress,MacAddress:string;
  end;

  TMacListClass = class(TObject)
  private  
    { Private declarations }  
  public  
    IpAndMac:RecIpAndMac;  
    { Public declarations }  
  end;

  TGetMacThread = class(TThread)
  private
    IpHead: string;
    BeginIp, EndIp: integer;
  protected
    procedure Execute; override;
  public
    constructor Create(LowIp, HighIp: Integer; BaseIP: string);
  end;

TMacAddressSearchClass=class(TObject)
  private
    T_GetMacThread:array[1..10] of TGetMacThread;
    FOnStartMacSearch: TNotifyEvent;
    procedure SetOnStartMacSearch(Value: TNotifyEvent);

  public
    procedure GetMacList();
    function  SearchMacFinish():boolean;
  published
    property OnStartMacSearch: TNotifyEvent read FOnStartMacSearch write SetOnStartMacSearch;
  end;

var
  MacAddressSearchClass: TMacAddressSearchClass;
  FindMacList:TObjectList;

implementation

function sendarp(ipaddr: ulong; temp: dword; ulmacaddr: pointer; ulmacaddrleng: pointer): Dword; stdcall;
  external 'Iphlpapi.dll' Name 'SendARP';

function GetMACByIP(const Ip: string): string;
var
  MyIp: ulong;
  MyMac: array[0..5] of byte;
  MyMacLength: ulong;
  ErrCode: integer;
begin
  Myip := inet_addr(PChar(Ip));
  MyMacLength := Length(MyMac);
  ErrCode := SendArp(MyIp, 0, @MyMac, @MyMacLength);
  if ErrCode = 0 then
    Result := Format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x', [MyMac[0], MyMac[1], MyMac[2], MyMac[3], MyMac[4], MyMac[5]])
  else
    Result := ''; 
end;

procedure TGetMacThread.Execute;
var
  i: integer;
  ip, mac, FactoryCode: string;
  MacListCls:  TMacListClass;
begin
    FreeOnTerminate := true; 
  for i := BeginIp to EndIp do
  begin
    ip := IpHead + IntToStr(i);
    mac := GetMACByIP(ip);
    FactoryCode := copy(mac, 1, 8);
    if (length(mac) > 12) and (FactoryCode = '00:14:97') then   //and (FactoryCode = '00:14:97')
    begin
      MacListCls :=  TMacListClass.Create;
      MacListCls.IpAndMac.IPAddress:=ip;
      MacListCls.IpAndMac.MacAddress:=mac;
      FindMacList.Add(MacListCls);
    end;
  end;

end;

constructor TGetMacThread.Create(LowIp, HighIp: Integer; BaseIP: string);
begin
  inherited Create(false);
  IpHead := BaseIP;
  BeginIp := LowIp;
  EndIp := HighIp;
end;       

procedure TMacAddressSearchClass.SetOnStartMacSearch(Value: TNotifyEvent);
begin
  FOnStartMacSearch:=Value;
end;

procedure TMacAddressSearchClass.GetMacList();
var
  Base_IP: string;
  i, j, bgnIp, endip: integer;
begin

  bgnIp := 0;
  endip := 0;

  FindMacList.Clear;
  
  Base_IP := NameToIP(GetLocalComputerName);
  for j := Length(Base_IP) - 1 downto 0 do
  begin
    if Base_IP[j] = '.' then
    begin
      Base_IP := Copy(Base_IP, 1, j);
      break;
    end;
  end;

  for i := 1 to 10 do
  begin
    case i of
      1:
        begin
          bgnIp := 2;
          endIp := 25;
        end;
      2..9:
        begin
          bgnIp := (i - 1) * 25 + 1;
          endIp := i * 25;
        end;
      10:
        begin
          bgnIp := 226;
          endIp := 254;
        end;
    end;

    T_GetMacThread[i] := TGetMacThread.Create(bgnIp, endIp, Base_IP);
  end;
end;

function TMacAddressSearchClass.SearchMacFinish():boolean;
var i,x:Byte;
begin
  x:=0;
  for i := 1 to 10 do
  begin
    if T_GetMacThread[i].Terminated then x:=x+1;
    showmessage(IntToStr(i)+'  '+BoolToStr(T_GetMacThread[i].Terminated,True)+'  '+BoolToStr(T_GetMacThread[i].Suspended,True));
  end;

  if x=10 then Result:=True else Result:=False;
end;

initialization
  MacAddressSearchClass := TMacAddressSearchClass.Create;
  FindMacList := TObjectList.Create;

finalization
  MacAddressSearchClass.Free;
  FindMacList.Free;
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值