发送ICMP ping

对于ICMP ping请求(echo请求),我是否需要获取目标的MAC地址? 我试图学习如何使用原始套接字在C中实现它,但无法理解如何获取目标的MAC地址。

任何帮助表示赞赏。 谢谢。

[…]我需要获取目的地的MAC地址吗?

在大多数情况下,不,你不应该。

raw(7)的man-page(我的重点):

原始套接字允许在用户空间中实现新的IPv4协议。 原始套接字接收或发送不包括链接级头的原始数据

这是合乎逻辑的,因为您可能正在ping不在同一子网上的东西,在这种情况下,MAC地址将是路由器的MAC地址。

为了certificate这一点, 这里有一个旧的BSD版本的ping的一些源代码 – 我在Google上找到的第一个。 请注意,它不会尝试查找目标MAC地址。

请注意,某些UNIX ping程序可以执行各种有趣的操作。 例如,某些版本允许您欺骗传出的源IP。 一些版本包括arpingfunction。 在这些情况下,它们将在较低级别(链接级别)注入内容,在这种情况下,您将需要原始标头。