我想将数据包发送到另一台机器,但以太网头中的MAC地址不同。为此,我在C中使用原始套接字并创建自己的以太网头,以便可以根据需要设置源MAC。问题是我不确定要在标题中填写哪个目标MAC地址。我知道目标计算机的IP,但不知道MAC。即使知道,我也不想对该MAC进行硬编码。
我看到的一个选择是,我的机器将知道其ARP表中的MAC,并且我可以读取它并获取MAC地址并进行填充。但是在发送每个数据包之前这样做会产生开销。我可以阅读一次并继续使用,但是如果有一天替换目标计算机,该怎么办。管理员会将相同的IP地址分配给新计算机,但MAC地址将不同。新机器启动时,可能会发送免费的ARP,而我的机器将更新其ARP表。但是我的程序不知道这一点。我的程序将继续使用旧的MAC发送数据包。
我觉得我缺少一些非常基本的东西。有想法吗?
答案 0 :(得分:1)
您在这里看到的是每个人都试图实现网络堆栈的相同问题。 您有几种选择:
getString()
或/proc/net/arp
读取MAC地址,但是如果您的主机最近未尝试与之通信,则所寻找IP的条目可能不存在。当然,您可以在读取arp表之前将带有ioctl(SIOCGARP, ...);
的伪数据包发送到该主机。如果您更详细地描述您打算做什么,建议可能会更好。
答案 1 :(得分:0)
您可以使用SIOCSIFHWADDR
ioctl请求设置设备的MAC地址。 netdevice的手册是一个很好的起点。