Search code examples
delphinetwork-programmingsnmpindy

Delphi: Get MAC of Router


I am using Delphi and I want to determinate the physical MAC address of a network device in my network, in this case the Router itself.

My code:

var
  idsnmp: tidsnmp;
  val:string;
begin
  idsnmp := tidsnmp.create;
  try
    idsnmp.QuickSend('.1.3.6.1.2.1.4.22.1.2', 'public', '10.0.0.1', val);
    showmessage(val);
  finally
    idsnmp.free;
  end;
end;

where 10.0.0.1 is my router.

Alas, QuickSend does always send "Connection reset by peer #10054". I tried to modify the MIB-OID and I also tried the IP 127.0.0.1 which connection should never fail. I did not find any useable Tutorials about TIdSNMP at Google. :-(

Regards Daniel Marschall


Solution

  • You can use the SendARP function to get the Mac Address.

    check this sample

    uses
     Windows,
     WinSock,
     SysUtils;
    
    
    function SendArp(DestIP,SrcIP:ULONG;pMacAddr:pointer;PhyAddrLen:pointer) : DWord; StdCall; external 'iphlpapi.dll' name 'SendARP';
    
    
    function GetMacAddr(const IPAddress: string; var ErrCode : DWORD): string;
    var
    MacAddr    : Array[0..5] of Byte;
    DestIP     : ULONG;
    PhyAddrLen : ULONG;
    WSAData    : TWSAData;
    begin
      Result    :='';
      WSAStartup($0101, WSAData);
      try
        ZeroMemory(@MacAddr,SizeOf(MacAddr));
        DestIP    :=inet_addr(PAnsiChar(AnsiString(IPAddress)));
        PhyAddrLen:=SizeOf(MacAddr);
        ErrCode   :=SendArp(DestIP,0,@MacAddr,@PhyAddrLen);
        if ErrCode = S_OK then
         Result:=Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',[MacAddr[0], MacAddr[1],MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]])
      finally
        WSACleanup;
      end;
    end;