Melnik Yuri
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору uses ..., CommCtrl; // Для работы с ARP (Address Resolution Protocol) таблицей const IPHLPAPI = 'IPHLPAPI.DLL'; MAX_ADAPTER_ADDRESS_LENGTH = 7; type TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH] of byte; // Это структура для единичного запроса TMibIPNetRow = packed record dwIndex : DWORD; dwPhysAddrLen : DWORD; bPhysAddr : TMACAddress; // Вот здесь и лежит МАС!!! dwAddr : DWORD; dwType : DWORD; end; TMibIPNetRowArray = array [0..512] of TMibIPNetRow; PTMibIPNetTable = ^TMibIPNetTable; TMibIPNetTable = packed record dwNumEntries : DWORD; Table: TMibIPNetRowArray; end; function GetIpNetTable; external IPHLPAPI name 'GetIpNetTable'; // Вот функция получения MAC-адреса из IP function GetMacFromIP(const IP: String): String; function TMainForm.GetMacFromIP(const IP: String): String; function GetMAC(Value: TMacAddress; Length: DWORD): String; var I: Integer; begin if Length = 0 then Result := '00-00-00-00-00-00' else begin Result := ''; for i:= 0 to Length -2 do Result := Result + IntToHex(Value[i], 2) + '-'; Result := Result + IntToHex(Value[Length-1], 2); end; end; function GetDottedIPFromInAddr(const InAddr: Integer): String; begin Result := ''; Result := IntToStr(FOURTH_IPADDRESS(InAddr)); Result := Result + '.' + IntToStr(THIRD_IPADDRESS(InAddr)); Result := Result + '.' + IntToStr(SECOND_IPADDRESS(InAddr)); Result := Result + '.' + IntToStr(FIRST_IPADDRESS(InAddr)); end; var Table: TMibIPNetTable; Size: Integer; CatchIP: String; Err, I: Integer; begin Result := RES_UNKNOWN; Size := SizeOf(Table); Err := GetIpNetTable(@Table, @Size, False); if Err <> NO_ERROR then begin ShowMessage(SysErrorMessage(GetLastError)); Exit; end; // Теперь мы имеем таблицу из IP адресов и соответсвующих им MAC адресов for I := 0 to Table.dwNumEntries - 1 do // Ищем нужный IP ... begin CatchIP := GetDottedIPFromInAddr(Table.Table[I].dwAddr); if CatchIP = IP then // И выводим его МАС ... begin Result := GetMAC(Table.Table[I].bPhysAddr, Table.Table[I].dwPhysAddrLen); Break; end; end; end; | Всего записей: 231 | Зарегистр. 17-08-2006 | Отправлено: 13:56 03-12-2008 | Исправлено: Melnik Yuri, 15:00 03-12-2008 |
|