2011-07-25 16 views
1

Javaを使用してDHCPクライアントを作成しようとしています。 クライアントはディスカバーを送信し、オファーを受け取り、リクエストを送信し、Ackを受信します。 しかし、ディスクバーと要求UDP DatagramPacketsを送信する場合、DHCPのポイントはDHCPサーバーから使用可能なIPアドレスを受け取ることであるため、IP 0.0.0.0ポート68からそれらを送信する必要があります。 しかし、ソケットを0.0.0.0にバインドすると、Javaリファレンスのhttp://download.oracle.com/javase/6/docs/api/java/net/DatagramSocket.htmlによれば、カーネルはソケットにIPアドレスを割り当てます。JavaのDHCPクライアント、IPから送信できません0.0.0.0

私は

$ sudo ifconfig en0 0.0.0.0   

を経由して0.0.0.0に私のイーサネットカードのIPアドレスを設定し、自分のパケットを送信する強制した場合、受け取ったのは

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

例外です。

UDPパケットを0.0.0.0から送信し、System.exec()(必要な場合)を使用して、Javaを使用してDHCPサーバーから受信したIPアドレスを設定しますか?

答えて

1

このライブラリを使用してDHCPを実行できないことがあります。図書館では、DHCPが送信先アドレスとして0.0.0.0を使用しないことを指定していても、0.0.0.0を送信者アドレスとして使用しないことを前提としています。 RFCをスキャンするだけで、「送信者フィールドに記入しないでください」と表示されているようです。それが無視される可能性はありますか? DHCPはすべて放送されているので、それは問題ではなく、あなたは何かを記入することができます。 Wiresharkや別のパケットスニッファーで実際に0.0.0.0かどうかを確認するためにDHCP要求を聞いてみましたか?

データグラムをより低いレベルで構築する必要があるかもしれません。

DatagramSocketを使用している場合、自分のIPアドレスがどのように設定されているかは関係ありません。なぜなら、ライブラリは0.0.0.0を割り当てようとすると変更するためです。

編集: dhclientソースの一部をスキャンしましたが、その巨大さとわかりませんが、シェルスクリプトを使用してifconfigを使用してインターフェイスを設定しているようです。それで、それは質問のその部分に答えるかもしれません。だから、今のところIPアドレスを変更するためにifconfigを使うことができます。

+0

また、DHCPクライアントのIPアドレスを設定する必要があるため、JavaコードからIPアドレスを設定する方法を見つけ出す必要があります.Ooops、私はあなたの最後の部分を見逃しました質問。あなたはそれをより良くするために編集したいかもしれません。 –

+0

私はWiresharkをチェックし、実際のDHCPクライアントは0.0.0.0からパケットを送りますが、私が作成したクライアントは現在割り当てられているアドレスから送信しています....だから、私はおそらくCでプログラムするべきだと思いますか? ) – Heartinpiece

+0

Javaはあなたに必要な柔軟性を提供すると確信していますが、私はあなたがそれを行う必要があるかどうかはわかりません。 DatagramSocketを使用するのではなく、Socket(http://download.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html)を使用することができます。あなたはDatagramSocketがUDPを行うように設定するようなことをしなければなりません。残念なことに、私はJavaでそれをしていない、Cのみ、私は推測だ。しかし、私はJavaがそれを処理できるはずだと思います。 –

0

0.0.0.0は、ローカルネットワーク全体を表すipです。ネットワークカードをバインドすることはできません。パケットをブロードキャストするだけです。255.255.255.255

+0

もし私がC言語でコーディングしているのなら、SOCK_RAWは何とかしてくれますか? – Heartinpiece

+0

@Heartinpieceはおそらく少し遅れますが、これを読んでいる他の人のために、あなたの変更を別の質問として尋ねるのが最善です。サーチ。 –

関連する問題