我正在开发一个具有客户端-服务器架构的模块。我必须根据 MAC address 对连接的对等计算机进行身份验证.
在安装时,我存储了一个有效 MAC 地址的加密列表。
请注意,我无法控制这台对等机器,一些第三方应用程序将在这台机器上运行,我无法在这台对等机器上安装任何应用程序。
在运行时发生套接字连接时,我需要知道连接中使用的 IP 地址的 MAC 地址,以便我可以根据先前存储的 MAC 地址对其进行验证。
是否有可用的 C/C++ API 可以帮助我从 IP 地址获取 MAC 地址。这台机器通常连接在一个局域网中,但它可以在不同的子网中。
我的模块是多平台的,可以在 Windows、Solaris 和 Linux 上运行,同样,对等机器可以在任何操作系统上运行。
不幸的是,简单的答案真的是“不要那样做”。
如果你的对等机器在不同的子网上(因此你和对等机器之间的流量通过路由器),那么就没有办法做你想做的事——你收到的数据包的 MAC 地址将是将它们转发给您的路由器的 MAC 地址,因为这是您正在与之通信的链路层设备。只有离对等机器最近的路由器才会知道对等机器的 MAC 地址是什么——并且不会传递此信息。
如果对等机器在同一个子网上,那么传入的数据包将在以太网 header 中包含对等机器的 MAC 地址……但在将数据包传送到您的应用程序之前,这会被删除。您的选择非常有限,要么在您正在监听的网络接口(interface)上捕获数据包以获取整个数据包,要么使用您的系统提供的任何工具来检查本地 ARP 表。这两个选项都非常依赖于平台!
此外,如果您处理的接口(interface)不是以太网接口(interface)(可能是 PPP 链接、WiFi,或某种时髦的虚拟化接口(interface),... ),也不支持 IPv6。
如果在这之后,您仍然下定决心,请查看 libpcap/WinPCap用于数据包捕获,这是我想到的最便携的选择。为了检查本地 ARP 表,Linux、OS X、Solaris 和 Windows 都提供了 arp
命令行实用程序,但语法可能有所不同。如果 API 可用,我不希望平台之间有任何共性 - 这类事情没有标准,因为你真的不应该这样做!