Консультация № 146426
08.10.2008, 11:07
0.00 руб.
0 2 1
Всем привет! Уважаемые эксперты, подскажите, как определить MAC-адрес удалённой машины в сети, зая IP и имя?

Обсуждение

Неизвестный
08.10.2008, 11:24
общий
это ответ
Здравствуйте, Бава Александр Викторович!

вот ссылка - там популярно все расписано http://forum.shelek.ru/index.php/topic,584.0.html
Неизвестный
08.10.2008, 20:51
общий
Вот приблизительно так:

Код:
 uses SysUtils, CommCtrl, ...; 

const
IPHLPAPI = 'IPHLPAPI.DLL';

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';

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;

// Получаем IP адрес
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;


Здесь пример вызова функции:

Код:
 GetMacFromIP('192.168.1.1') 
Форма ответа