Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по компонентам для Delphi, C++ Builder разных версий

Модерирует : ShIvADeSt

ShIvADeSt (26-06-2017 02:39): Продолжение тут
http://forum.ru-board.com/topic.cgi?forum=33&topic=14667
 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

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
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по компонентам для Delphi, C++ Builder разных версий
ShIvADeSt (26-06-2017 02:39): Продолжение тут
http://forum.ru-board.com/topic.cgi?forum=33&topic=14667


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru