バックストーリー:
独自の SSID を作成し、auto-ip を使用して自分自身に IP アドレスを割り当て、255.255.255.255 への検出情報のブロードキャストを開始するワイヤレス デバイスがあります。(残念ながら、マルチキャストには簡単に対応していません)
私がやろうとしていること:
発見情報を受信し、構成情報をデバイスに送信できるようにする必要があります。問題は、auto-ip を使用すると、Windows などで「IP ネゴシエーション」プロセスに数分かかる場合があることです (その間、ブロードキャストを確認でき、ブロードキャスト情報をデバイスに送り返すことさえできます)。
そこで、接続されているすべてのネットワーク インターフェイスを列挙し (デバイスとの通信にどれが使用されるかを直接判断することはできません)、それらのアドレスごとに DatagramSocket を作成し、リッスンを開始します。特定のソケットを介して発見情報を受信した場合、その同じソケットを使用してデータをデバイスに送り返すことができることがわかります。これは Windows で動作します。
問題:
Linux および OSX では、次のコードはブロードキャスト パケットを受信しません。
byte[] addr = {(byte)169, (byte)254, (byte)6, (byte)215};
DatagramSocket foo = new DatagramSocket(new InetSocketAddress(InetAddress.getByAddress(addr), PORT_NUM));
while (true)
{
byte[] buf = new byte[256];
DatagramPacket pct = new DatagramPacket(buf, buf.length);
foo.receive(pct);
System.out.println( IoBuffer.wrap(buf).getHexDump() );
}
(Linux/OSX 上で) ブロードキャスト パケットを受信するには、以下を使用して DatagramSocket を作成する必要があります。
DatagramSocket foo = new DatagramSocket(PORT_NUM);
ただし、このソケットを使用してデータをデバイスに送り返すと、パケットは OS によってルーティングされ (私は推測しています)、対象のインターフェイスが自動 IP ネゴシエーションの途中である可能性があるため、失敗します。
次のことについて考えますか?
- Linux/OSX で Windows の「動作する」動作を実現する方法
- このプロセスを処理するより良い方法
前もって感謝します!