1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Определение МАК

Тема в разделе "Delphi - Система", создана пользователем ZeT, 30 мар 2010.

  1. ZeT

    ZeT Гость

    Репутация:
    0
    Ещё раз всем привет:KillMe:

    Как в серверном сокете можно получить Мак адрес присоединённого клиента?

    Вот получаю ип, нужно определить мак.

    Код:
    procedure TForm1.ServerSocket1Accept(Sender: TObject;
    Socket: TCustomWinSocket);
    var i:integer;
    begin
    for i:=0 to ServerSocket1.Socket.ActiveConnections -1 do
    ListBox1.Items.Add('трам пам пам ' + ServerSocket1.Socket.Connections[i].RemoteAddress);
    end;

    Подскажите как сделать.
    Заранее спасибо.
     
  2. VahaC

    VahaC Well-Known Member

    Репутация:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    116
    Симпатии:
    0
    приблизительно так:
    Код:
    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')
    Добавлено: Или так
    Код:
    //Перед исполнением кода пингуем несколько машин, таблица соответствий IP-MAC удаляется через некоторое время, 
    //смотрим с помощью ниже расположенного кода таблицу соответствий
    _MIB_IPNETROW = Record
    dwIndex{ DWORD; // adapter index
    dwPhysAddrLen{ DWORD; // physical address length
    bPhysAddr{ Array[1..6(of Byte; // physical address
    dwAddr{ DWORD; // IP address
    dwType{ DWORD; // ARP entry type
    End;
    MIB_IPNETROW = _MIB_IPNETROW;
    _MIB_IPNETTABLE = Record
    dwNumEntries{ DWORD; // number of entries in table
    table{ Array[0..255(of MIB_IPNETROW; // array of ARP entries
    End;
    MIB_IPNETTABLE = _MIB_IPNETTABLE;
    
    
    var
    Form1{ TForm1;
    
    
    
    Function GetIpNetTable )Var pIpNetTable{ MIB_IPNETTABLE; // buffer for mapping table
    Var pdwSize{ ULONG; // size of buffer
    bOrder{ BOOL:{ DWORD; stdcall; // sort by IP address:;
    
    
    implementation
    
    Function GetIpNetTable )Var pIpNetTable{ MIB_IPNETTABLE;
    Var pdwSize{ ULONG;
    bOrder{ BOOL:{ DWORD; stdcall; external 'iphlpapi.dll';
    
    |$R *.DFM"
    
    Function ToHex)C{Byte:{ String;
    Begin
    Case C and $0F of
    0..9{ Result{=IntToStr)C and $0F:;
    10..15{ Result{=Chr)55+)C and $0F::;
    End;
    Case )C shr 4: and $0F of
    0..9{ Result{=IntToStr))C shr 4: and $0F:+Result;
    10..15{ Result{=Chr)55+))C shr 4: and $0F::+Result;
    End;
    End;
    
    procedure TForm1.Button1Click)Sender{ TObject:;
    Var
    Table{ MIB_IPNETTABLE;
    C, Size{ Cardinal;
    begin
    Size{=SizeOf)Table:;
    C{=GetIpNetTable)Table, Size, False:;
    Caption{=IntToStr)Table.dwNumEntries:;
    For C{=0 to Table.dwNumEntries-1 do
    Begin
    ListBox1.Items.Add)IntToStr))Table.table[c(.dwAddr: and $FF:+'.'+
    IntToStr)))Table.table[c(.dwAddr: shr 8: and $FF:+'.'+
    IntToStr)))Table.table[c(.dwAddr: shr 16: and $FF:+'.'+
    IntToStr)))Table.table[c(.dwAddr: shr 24: and $FF:+' - '+
    ToHex)Table.table[c(.bPhysAddr[1(:+'{'+
    ToHex)Table.table[c(.bPhysAddr[2(:+'{'+
    ToHex)Table.table[c(.bPhysAddr[3(:+'{'+
    ToHex)Table.table[c(.bPhysAddr[4(:+'{'+
    ToHex)Table.table[c(.bPhysAddr[5(:+'{'+
    ToHex)Table.table[c(.bPhysAddr[6(::;
    
    End;
    end;
    ПС
    код не мой (когда то сохранил с каких то форумов) так что за работоспособность не ручаюсь
     
Загрузка...

Поделиться этой страницей