【问题标题】:DHCP Client on Java, Can't send from IP 0.0.0.0Java 上的 DHCP 客户端,无法从 IP 0.0.0.0 发送
【发布时间】:2011-07-28 02:08:59
【问题描述】:

我正在尝试使用 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 地址设置?

【问题讨论】:

    标签: java client udp ip dhcp


    【解决方案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 地址。

    【讨论】:

    • 另外,你必须想办法从你的java代码中设置你的IP地址,因为你需要为你的DHCP客户端设置IP地址才能工作......哎呀,我错过了你问题的最后一部分。您可能需要进行编辑以使其更加突出。
    • 是的,我检查了 Wireshark 和实际的 DHCP 客户端从 0.0.0.0 发送数据包,而我创建的客户端从当前分配的地址发送......所以你认为我应该用 C 编程吗?(要达到较低的水平?)
    • 我很确定 Java 会为您提供所需的灵活性,但我不确定您需要做什么。您可以使用 Socket (download.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html),而不是使用 DatagramSocket。你必须做 DatagramSockets 为你做的事情,比如配置它来做 UDP。不幸的是,我没有在 Java 中做过,只有 C,所以我在推测。但我认为Java应该能够处理它。
    • 这有点不相关,但是你将如何在 C 中从 0.0.0.0 发送数据包?我正在尝试 SOCK_RAW 类型,并手动创建了 IP 和 UDP 标头,但内核似乎在遇到 sendto() 函数时修改了源 IP 地址。对于这个问题有什么想法或建议吗?
    • 我承认我没有尝试过这个,但我会假设当你 bind() 时你会指定 0.0.0.0 作为你的本地地址。之后,sendto() 还在使用你的 IP 地址吗?
    【解决方案2】:

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

    【讨论】:

    • 如果我使用 C 进行编码,SOCK_RAW 对我有什么帮助吗?
    • @Heartinpiece 对您来说可能有点晚了,但为了其他可能正在阅读本文的人 - 最好将您的修改作为另一个问题提出,因为这将有助于指导其他人寻找通过搜索在 C 中回答相同的问题。
    猜你喜欢
    • 2019-05-22
    • 2018-09-19
    • 2018-02-26
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多