2011-12-14 31 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の場合は、正しい認証の詳細が必要です。

もう1つの方法は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のいずれかで照会する必要があります。