【问题标题】:How to receive broadcasts from nodes with the same ip address?如何接收来自具有相同 IP 地址的节点的广播?
【发布时间】:2014-08-05 21:27:53
【问题描述】:

我有一个由运行嵌入式 linux 的独立模块组成的设备。这些模块都是相同的硬件和软件,但根据它们在设备中的位置执行不同的任务。所有模块都通过内部网络相互通信。模块的 IP 地址是根据设备中的位置静态设置的。这是通过让模块读取返回 0-15 数字的物理设置设备来完成的。它插入模块,但物理连接到设备中的位置。一个设备可能有 6 个机架,因此这些插头中有 6 个设置为 1-6。

我希望设备确定是否有任何模块设置不正确,因为这会导致两个或更多模块具有相同的 IP 地址。这可能是由于位置加密狗设置不正确或损坏造成的。模块使用广播 UDP 消息相互通信。消息的数据成员之一是唯一的 48 位序列号,即 MAC 地址。

我最初的计划是让所有模块将来自它们自己的消息与它们的序列号进行比较,如果它们不匹配则抛出错误。问题是模块只接收来自它们自己或另一个 IP 地址的广播数据包。他们看不到来自同一 IP 地址但来自不同模块的数据包。

当我使用 ifconfig 检查接口时,我可以看到 Rx 数据包在增加,但是当我使用 netstat -su 时,我什么也看不到。 UDP Rx 数据包永远不会增加。因此,有时它们会从堆栈中删除。

有没有办法解决这个问题?我知道我可以依靠第三个节点来告诉它正在接收来自相同 IP 地址但不同 MAC 的广播数据包,但我希望每个模块都能意识到这个问题。

【问题讨论】:

    标签: c linux broadcasting


    【解决方案1】:

    在启动时,模块应广播一个 ARP 数据包,告知其 MAC 和 IP。这是重复 IP 地址的“正常”解决方案,您可以收听这些广播并发送一个新的,这样您的模块将检测到网络上的其他人正在使用相同的 IP。

    【讨论】:

    • 问题是,有问题的模块不会看到彼此广播,因为数据包被丢弃了。所以,他们只是互相离线。我想我可以添加一个额外的东西来检查节点是否关闭,但我希望它更直接。
    • ARP 广播不是 UDP 广播,它是以太网级别的广播,但协议与 UDP 不同。您需要创建一个特殊的套接字来接收它们(如果我没记错的话,原始套接字)。对了,你为什么不从MAC地址中推导出IP呢?
    • 啊,我得去探索一下。我以前从未接触过原始套接字。就生成唯一 IP 而言,假设每个模块都知道假设在设备中的所有其他模块。直到运行时才知道这一点会导致问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多