在GNU/Linux/C中使用多播(224.0.0.12)发现DHCP服务器

5
这个问题可能源于对IP组播的基本误解,如果我理解错了,请纠正我。
我正在尝试编写C代码以查找网络上所有DHCP服务器的IP地址。使用情况如下:
1.客户端广播DHCP发现。 2.我的专有中继代理拾取数据包,添加一些必要信息,并将其UNICAST转发到已知IP地址的DHCP服务器。
我的问题是告诉中继代理DHCP服务器在哪里。我发现IANA为DHCP服务器保留了多播地址224.0.0.12,因此我想配置服务器以侦听该多播流量。但是,每当我将Linux套接字选项配置为IP_ADD_MEMBERSHIP到224.0.0.12时,它就会使用IGMP,这是一种完全不同的协议,我不想实现它。
我是否只是误解了多播的工作原理? 我不应该能够从中继代理向224.0.0.12发送ping,并从所有DHCP服务器返回ping响应吗?
其他信息: - 当我运行ifconfig时,所有框的接口都列出了MULTICAST。 - 我已经在所有框上使用ip route add 224.0.0.0/4 dev eth0添加了多播路由。

你能检查一下组播路由是否已配置吗?http://www.dancres.org/bjspj/docs/docs/linux.html - ChristopheD
你能否发布代码,这样我们就可以在应用程序中找到错误了吗? - dwalter
你必须使用IGMP进行多播;这似乎存在一些误解。内核会为您处理所有的IGMP,就像处理ARP和IP一样,您不必担心它。问题在于,在广播中,路由(相当)容易:数据包只需到处传递即可。然而,要接收多播回复,您必须接受使用IGMP,告诉网络上的路由器您对多播数据包感兴趣。如果您不告诉它们,它们怎么知道将消息转发给您所在的组?尽管如此,DHCP通常也会使用广播。 - Nicholas Wilson
不,你不应该能够ping一个多播地址并且有任何属于该多播地址的成员回复 - 这不是ping和多播的工作方式。除非你正在开发自己的操作系统,否则你不必自己实现IGMP。你可以在 _广播_(而不是多播)地址上发出dhcp查询,并确定响应的DHCP服务器的IP地址。 - nos
2个回答

2
也许你应该像客户端一样,在目标网络上广播(而不是组播)一个DHCPDISCOVER数据包?我有几个正在运行的、工作正常的DHCP服务器,但它们都没有在224网络上监听。 你可能还想请求你现有的地址,或者发送一个DHCPRELEASE来释放任何你得到的地址,这样就不会在服务器上占用虚假预留的地址了。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接