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

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

  1. ZeT

    ZeT Гость

    Ещё раз всем привет:KillMe:

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

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

    Код (Delphi):
    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

    Регистрация:
    10 янв 2007
    Сообщения:
    116
    Симпатии:
    0
    приблизительно так:
    Код (Delphi):
    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;
    пример вызова
    Код (Delphi):
    GetMacFromIP('192.168.1.1')
    Добавлено: Или так
    Код (Delphi):
    //Перед исполнением кода пингуем несколько машин, таблица соответствий 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;
    ПС
    код не мой (когда то сохранил с каких то форумов) так что за работоспособность не ручаюсь
     
Загрузка...

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