2011-12-14 7 views
3

라우터에 연결된 모든 MAC 주소를 나열하고 싶습니다.내 라우터에 연결된 모든 MAC 주소 목록 및 IP 주소

모든 응용 프로그램이이 목적으로 WinPcap을 사용한다고 생각합니다. 내 델파이 응용 프로그램과 인터페이스 할 수있는 방법이 있습니까?

+0

ARP가 아마도 갈 방법입니다. [delphi-get-mac-of-router] (http://stackoverflow.com/questions/4550672/delphi-get-mac-of-router). –

+0

WinPCap은 네트워크에서 로깅/스니핑 및 패킷 캡처를위한 것으로 IP 및 Mac만을 나열하지 않습니다. –

+0

아마도 당신의 가정 일뿐입니다. – opc0de

답변

7

이렇게 할 수있는 방법이 몇 가지 있습니다. 첫 번째는 SNMP를 통해 라우터에 연결하고 atTable (1.3.6.1.2.1.3.1)을 읽는 것입니다. 이렇게하면 MAC 주소와 일치하는 IP 주소 목록이 제공됩니다. Synapse의 SNMP 기능을 사용하여 테이블을 읽을 수 있습니다. SNMPv1 또는 SNMPv2c를 실행하는 라우터에 연결하려면 올바른 읽기 커뮤니티 문자열이 필요합니다. SNMPv3의 경우 올바른 인증 세부 정보가 필요합니다.

또 다른 방법은 ARP를 사용하는 것입니다. ARP 요청을 보내려면 iphlpapi dll을 사용할 수 있습니다. 시작해야 할 코드가 있습니다.

unit MyARP 

interface 

uses 
    Windows, Classes, SysUtils, WinSock; 

function SendARP(DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD;stdcall; external 'iphlpapi.dll'; 
function MySendARP(const IPAddress: String): String; 

implementation 

function MySendARP(const IPAddress: String): String; 
var 
    DestIP: ULONG; 
    MacAddr: Array [0..5] of Byte; 
    MacAddrLen: ULONG; 
    SendArpResult: Cardinal; 
begin 
    DestIP := inet_addr(PAnsiChar(AnsiString(IPAddress))); 
    MacAddrLen := Length(MacAddr); 
    SendArpResult := SendARP(DestIP, 0, @MacAddr, @MacAddrLen); 

    if SendArpResult = NO_ERROR 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]]) 
    else 
    Result := ''; 
end; 

end. 

이 방법은 로컬 서브넷에서만 작동합니다.

+0

만약 내가 네트워크에 연결되어 있지 않다면 ARP 요청을 사용할 수 있습니까? – opc0de

+0

예, 검색하려는 MAC 주소가있는 장치가 동일한 서브넷에있는 한. 예 : 10.0.0.0/255.255.255.0은 10.0.0.1에서 10.0.0.254까지의 IP 주소를 포함합니다 (10.0.0.0은 자주 사용되지 않고 10.0.0.255는 브로드 캐스트 주소입니다) – norgepaul

+0

은 IP를 사용하여 게이트웨이 MAC 주소를 얻는 데 도움이되는 유용한 기능입니다 – waza123

0

일반적으로 라우터가 이러한 쿼리를 지원한다고 가정하면 SNMP 또는 uPNP를 사용하여 rouer 자체를 쿼리해야합니다.