c++ - 从IP地址查找MAC地址

标签 c++ c

<分区>

我正在开发一个具有客户端-服务器架构的模块。我必须根据 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 可用,我不希望平台之间有任何共性 - 这类事情没有标准,因为你真的不应该这样做!

关于c++ - 从IP地址查找MAC地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104661/

相关文章:

c++ - 为什么在丢弃指向该对象的指针的常量之后写入一个非常量对象而不是 UB?

c++ - C++ 静态库可以链接到共享库吗?

c++ - gcc 编译器的 IDE

c - "volatile const int a"与 "const volatile int a"?

c - 从c中的命令行读取数字

c - 通用堆栈库的问题

c++ - 如何避免第三方库(无源代码)从物理内存分配内存?

c++ - 为什么 C 字 rune 字是 int 而不是 char?

无法理解为什么 C 指针不起作用

结合两个 16 位 RGB 颜色与 alpha 混合