2011-07-25 96 views
1

我正在嘗試使用Java創建DHCP客戶端。 客戶端將發送Discover,接收要約,發送請求並接收確認。 但是,在發送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地址。Java上的DHCP客戶端,無法從IP發送0.0.0.0

如果我強迫通過

$ sudo ifconfig en0 0.0.0.0   

設置我的網卡的IP地址爲0.0.0.0,並把我的包;我收到一個

java.io.IOException: Can't assign requested address 

異常。

有沒有辦法從0.0.0.0發送UDP數據包並通過System.exec()(如果需要)設置使用Java從DHCP服務器接收到的IP地址?

回答

1

這可能是因爲你將無法使用這個庫來做DHCP。該庫假定您不希望將0.0.0.0用作發件人地址,即使DHCP指定不應在此處放置IP地址。只是掃描RFC,它似乎表明你「不應該填寫發件人字段。」它可能會被忽略嗎?這可能是因爲DHCP是全部廣播的,這不重要,你可以填寫任何東西。您是否嘗試過在Wireshark或其他數據包嗅探器上偵聽DHCP請求以查看它是否真的是0.0.0.0?

您可能必須在一個較低的水平,以建立自己的數據報。

我不認爲這將此事如何,因爲圖書館是怎麼回事,如果你嘗試和分配0.0.0.0改變它自己的IP地址設置,如果你使用的DatagramSocket。

編輯: 我掃描了部分dhclient源代碼,其巨大,我不明白它,但它看起來像他們使用shell腳本來配置接口使用ifconfig。所以這可能會回答問題的這一部分。所以你可以使用你的ifconfig來改變你的IP地址。

+0

此外,你將不得不找出一種方法來設置你的Java代碼的IP地址,因爲你將需要設置IP地址爲您的DHCP客戶端工作......哎呀,我錯過了你的最後一部分題。您可能想要進行編輯,以使其突出一點。 –

+0

是的,我檢查了Wireshark和實際的DHCP客戶端從0.0.0.0發送數據包,而我創建的客戶端從當前分配的地址發送....所以,你認爲我應該用C編程嗎?(要達到較低的水平? ) – Heartinpiece

+0

我很肯定Java會給你你需要的靈活性,但我不確定你需要做什麼。您可以使用Socket(http://download.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html),而不是使用DatagramSocket。你必須做DatagramSockets爲你做的事情,比如配置它來做UDP。不幸的是,我沒有在Java中做過,只有C,所以我在猜測。但我認爲Java應該能夠處理它。 –

0

0.0.0.0是代表整個本地網絡的IP。你可以不是你的網卡綁定到它,你只能將數據包發送到它的廣播IP 255.255.255.255

+0

例如如果我想在C編碼,將一個SOCK_RAW幫助我以任何方式? – Heartinpiece

+0

@Heartinpiece可能有點晚了你,而是爲別人着想誰可能是閱讀這一點 - 這是最好問一下您的修改爲另外一個問題,因爲這將有助於引導其他人找過答案同樣用C搜索。 –

相關問題