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.
查找MAC地址,用来搜索IPort的。
最新推荐文章于 2022-12-16 19:33:35 发布