因此,我正在使用原始套接字在 C 中实现 TCP 套接字,以便进一步了解计算机网络。我正在编写以太网标头代码,我可以使用 getifaddrs 获取烧录到我的 NIC 上的源 MAC 地址,但我不确定如何获取目标 MAC 地址。在 MacOS 所基于的 FreeBSD 中,看起来您可以使用 ioctl 系统调用,但 MacOS 似乎删除了通过该系统调用获取 MAC 地址的功能。有没有某种方法可以发出 ARP 请求,这是 MacOS 上的常识,但我似乎找不到任何相关信息?我发现的下一个最佳解决方案是解析 arp 命令,但这对我来说效率非常低,并且应该有一种更简单的方法来做到这一点。
任何帮助将不胜感激,我花了太多时间扫描 ifconfig.c 和随机头文件!
要获取目标 MAC 地址(您的 macOS 设备连接到的地址),您可以通过考虑 ARP(地址解析协议)来获取目标 MAC 地址。在 macOS 上,您将无法使用 ioctl 系统调用来实现此目的,如FreeBSD 但仍有一种方法可以处理它,一种选择是手动向目标 IP 发送 ARP 请求,以询问其 MAC 地址。 ARP 的工作原理是将 IP 地址映射到本地网络中的 MAC 地址,您可以通过执行以下步骤来实现它:
您创建并发送 ARP 数据包来询问目标节点您的 MAC 地址是什么?
另一端的设备响应其 MAC 地址,然后您可以使用该地址
但是,用 C 语言编写原始 ARP 数据包可能比您想要的更复杂。一种更简单但不太优雅的方法是从 C 代码中调用系统 arp 命令并解析其输出以获取 MAC 地址。例如,您可以使用
arp -n <destination_ip>
这将为您提供目标的 MAC 地址,但正如您所提到的,解析输出并不理想,并且效率低下如果您想要一个不使用 arp 的更原生的解决方案,您可以深入研究为 ARP 编写原始套接字,但这需要制作您自己的 ARP 请求并处理响应如果您同意 arp 命令作为临时解决方案,同时您探索更高级的选项,这可能是最快的前进方式
希望这对您的网络项目有所帮助并祝您好运