2

Java アプリについて助けが必要です。ワイルドカード アドレスにバインドされたデータグラム ソケットでブロードキャスト パケットを受信する必要があります。最も重要なことは、wlan0 に構成済みの IP アドレスが含まれていてはならないということです。このアプリの目的は、DHCP のようなサーバーから有効な IP を取得することだからです。
まず、0.0.0.0 で wlan0 を構成します。
さらに、wlan0 インターフェイス (唯一のインターフェイス) を経由するようにデフォルトのルーティングを設定します。
Ifconfig の出力は次のとおりです。

lo    Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:117 errors:0 dropped:0 overruns:0 frame:0
      TX packets:117 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:9337 (9.3 KB)  TX bytes:9337 (9.3 KB)


wlan0     Link encap:Ethernet  HWaddr 00:1b:77:dd:e7:a4  
      inet6 addr: fe80::21b:77ff:fedd:e7a4/64 Scope:Link
      UP BROADCAST MULTICAST  MTU:1500  Metric:1
      RX packets:30211 errors:0 dropped:1 overruns:0 frame:0
      TX packets:6128 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:16654450 (16.6 MB)  TX bytes:654646 (654.6 KB)

これは、クライアントでソケットを作成する方法です。

InetSocketAddress broadcast = new InetSocketAddress("0.0.0.0",listenPort);
socket = new DatagramSocket(null);
socket.setSoTimeout(5000);
socket.setBroadcast(true);
socket.bind(new InetSocketAddress(broadcast.getPort()));

次に、クライアントから 255.255.255.255 にデータグラム パケットを送信します。サーバー (同じサブネット上) はそれらを受信し、サブネット上のブロードキャストで応答します。クライアント マシンはサーバーのブロードキャスト パケットを受信しますが、ソケットは受信せず、socket.receive(); で自身をブロックします。

構成されていない (IP なしの) インターフェイスにバインドされたソケットでデータグラムを受信する方法はありますか?

wlan0 に IP を与えてみましたが、すべて動作しますが、wlan0 を構成せず、ワイルドカード アドレス 0.0.0.0 にのみバインドする必要があります。

4

2 に答える 2

0

「setBroadcast」および「setSoTimeout」を呼び出す前に「bind」呼び出しを実行します

于 2012-06-29T06:11:46.217 に答える
0

ソケットは構築時に既にバインドされているため、bind() は IOExceotion をスローしますか?

new DatagramSocket(null) を new DatagramSocket(broadcast) に変更します。bind() 呼び出しを削除します。new InetSocketAddress() の最初の引数を '0.0.0.0' から null に変更します。

于 2012-06-28T13:26:24.607 に答える