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

  • Автор темы ZeT
  • Дата начала
Z
#1
Ещё раз всем привет: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;

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

VahaC

Well-known member
10.01.2007
116
0
#2
приблизительно так:
Код:
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;
ПС
код не мой (когда то сохранил с каких то форумов) так что за работоспособность не ручаюсь