Delphi:获取路由器的MAC
我正在使用 Delphi,我想确定网络中网络设备的物理 MAC 地址,在本例中是路由器本身。
我的代码:
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;
其中 10.0.0.1 是我的路由器。
唉,QuickSend 总是发送“Connection Reset by Peer #10054”。我尝试修改 MIB-OID,还尝试了 IP 127.0.0.1,该连接永远不会失败。我在 Google 上没有找到任何关于 TIdSNMP 的可用教程。 :-(
问候 丹尼尔·马歇尔
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用
SendARP
函数来获取Mac地址。
检查这个样本
You can use the
SendARP
function to get the Mac Address.check this sample
不想抢 RRUZ 的风头,我提供了以下来自我的代码库的变体,并带有一些观察结果。我这样做是为了包含代码,作为答案而不是评论。
有几点需要说明。
无需调用 WSAStartup/WSACleanup。
编辑 正如 RRUZ 在评论中指出的那样,winsock 文档没有明确将 inet_addr 从 WSAStartup/WSACleanup 中排除,因此我撤回这一点。在 Vista 上,调用 RtlIpv4StringToAddress 更简单。话虽如此,inet_addr 非常容易实现,您自己的实现可能会更容易。
其次WinSock.pas中inet_addr的声明不正确。它将返回值声明为 u_long 类型,该类型在 WinSock.pas 中定义为 Longint。这是一个有符号 4 字节整数,但它应该是一个无符号 4 字节整数 ULONG。如果没有显式转换,您可能会遇到范围错误。
Not wishing to steal the thunder of RRUZ, I offer the following variant, taken from my codebase, with some observations. I've done this as an answer rather than a comment in order to include code.
There are a couple of points to make.
There is no need to call WSAStartup/WSACleanup.
EDIT As RRUZ points out in a comment, the winsock documentation does not explictly exempt inet_addr from WSAStartup/WSACleanup so I retract this point. On Vista it is simpler just to call RtlIpv4StringToAddress. Having said all that, inet_addr is so easy to implement it may just be easier to roll your own.
Secondly the declaration of inet_addr in WinSock.pas is incorrect. It declares the return value to be of a type u_long which is defined in WinSock.pas as Longint. This is a signed 4 byte integer but it should be an unsigned 4 byte integer, ULONG. Without the explicit cast you can get range errors.