获取连接到我的路由器和IP的所有MAC地址的列表

时间:2011-12-14 20:49:58

标签: delphi mac-address winpcap

我想列出连接到路由器的所有MAC地址,我知道这是可能的,因为我已经看过它了。

我认为所有应用程序都使用WinPcap用于此目的是否有一种方法可以将它与我的delphi应用程序连接?

2 个答案:

答案 0 :(得分:8)

有几种方法可以做到这一点。第一种是通过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.

此方法仅适用于您的本地子网。

答案 1 :(得分:0)

您必须查询路由器本身,通常使用SNMP或uPNP,假设路由器支持这样的查询。