1

我正在尝试使用 Java 创建一个 DHCP 客户端。客户端将发送 Discover,接收 Offer,发送 Request,并接收 Ack。但是,在发送发现和请求 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 参考,内核将分配一个 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 地址?

4

2 回答 2

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 地址。

于 2011-07-25T14:50:13.310 回答
0

0.0.0.0 是代表整个本地网络的 ip。你不能将你的网卡绑定到它,你只能发送数据包到它的广播 ip 255.255.255.255

于 2011-07-25T14:35:33.150 回答