如何在 C 中获取我的 macOS 设备所连接的节点的目标 MAC 地址?

问题描述 投票:0回答:1

因此,我正在使用原始套接字在 C 中实现 TCP 套接字,以便进一步了解计算机网络。我正在编写以太网标头代码,我可以使用 getifaddrs 获取烧录到我的 NIC 上的源 MAC 地址,但我不确定如何获取目标 MAC 地址。在 MacOS 所基于的 FreeBSD 中,看起来您可以使用 ioctl 系统调用,但 MacOS 似乎删除了通过该系统调用获取 MAC 地址的功能。有没有某种方法可以发出 ARP 请求,这是 MacOS 上的常识,但我似乎找不到任何相关信息?我发现的下一个最佳解决方案是解析 arp 命令,但这对我来说效率非常低,并且应该有一种更简单的方法来做到这一点。

任何帮助将不胜感激,我花了太多时间扫描 ifconfig.c 和随机头文件!

c macos arp raw-sockets
1个回答
0
投票

要获取目标 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 命令作为临时解决方案,同时您探索更高级的选项,这可能是最快的前进方式

希望这对您的网络项目有所帮助并祝您好运

© www.soinside.com 2019 - 2024. All rights reserved.