3

ルーターに接続されているすべてのMACアドレスを一覧表示したいのですが、これを確認したので、それが可能であることがわかります。

すべてのアプリケーションがこの目的でWinPcapを使用していると思いますが、delphiアプリケーションとインターフェイスする方法はありますか?

4

2 に答える 2

8

これを行うにはいくつかの方法があります。1つ目は、SNMPを介してルーターに接続し、atTable(1.3.6.1.2.1.3.1)を読み取ることです。これにより、MACアドレスに一致するIPアドレスのリストが表示されます。SynapseのSNMP機能を使用してテーブルを読み取ることができます。SNMPv1またはSNMPv2cを実行しているルーターに接続するには、正しい読み取りコミュニティストリングが必要です。SNMPv3の場合、正しい認証の詳細が必要になります。

もう1つの方法は、ARPを使用することです。ARP要求を送信するには、iphlpapidllを使用できます。ここにあなたが始めるべきいくつかのコードがあります。

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.

この方法は、ローカルサブネットでのみ機能します。

于 2011-12-14T21:31:39.023 に答える
0

ルーターが最初からそのようなクエリをサポートしていると仮定すると、通常はSNMPまたはuPNPを使用してルーター自体にクエリを実行する必要があります。

于 2011-12-14T21:24:40.180 に答える