我正在尝试使用Java创建DHCP客户端。 客户端将发送Discover,接收要约,发送请求并接收Ack。 但是,当发送discver和请求UDP DatagramPackets时,我需要从IP 0.0.0.0端口68发送它们,因为DHCP的目的是从DHCP服务器接收可用的IP地址。 但是,如果我将套接字绑定到0.0.0.0,根据http://download.oracle.com/javase/6/docs/api/java/net/DatagramSocket.html Java Reference,内核将为套接字分配IP地址。
如果我强制通过
将我的以太网卡的IP地址设置为0.0.0.0$ sudo ifconfig en0 0.0.0.0
并发送我的数据包;我收到了
java.io.IOException: Can't assign requested address
异常。
有没有办法从0.0.0.0发送UDP数据包并通过System.exec()
(如果需要)设置使用Java从DHCP服务器接收的IP地址?
答案 0 :(得分:1)
可能您将无法使用此库来执行DHCP。该库假定您不希望使用0.0.0.0作为发送方地址,即使DHCP指定您不应该在其中放置IP地址。只是扫描RFC,似乎表明你“不应该填写发件人字段”。是否有可能被忽略?可能因为DHCP全部是广播,所以无关紧要,您可以填写任何内容。您是否尝试在Wireshark或其他数据包嗅探器上侦听DHCP请求以查看它是否真的为0.0.0.0?
您可能需要在较低级别构建数据报。
如果您使用的是DatagramSocket,我认为如何设置您自己的IP地址并不重要,因为如果您尝试分配0.0.0.0,库将会更改它。
编辑: 我扫描了dhclient源代码的部分内容,而且它很大,我不明白,但看起来他们正在使用shell脚本来使用ifconfig配置接口。所以这可以回答问题的这一部分。因此,您可以像现在一样使用ifconfig更改IP地址。
答案 1 :(得分:0)
0.0.0.0是代表整个本地网络的ip。你不能绑定你的网卡,你只能发送数据包的广播IP 255.255.255.255