Как получить широковещательный пакет на 0.0.0.0?

Мне нужна помощь для моего приложения Java. Мне нужно получать широковещательные пакеты через сокет датаграмм, связанный с подстановочным адресом. Самое главное, что у моего wlan0 не должно быть настроенного IP-адреса, потому что целью этого приложения является получение действительного IP-адреса с сервера, вроде DHCP.
Сначала я настраиваю wlan0 на 0.0.0.0.
Кроме того, я настроил маршрутизацию по умолчанию, чтобы пройти через интерфейс 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) интерфейсом?

Я попытался дать IP для wlan0, и все работает, но мне нужно, чтобы wlan0 не был настроен, а был связан только с подстановочным адресом 0.0.0.0.

2 ответа

Выполните вызов "bind" перед вызовом "setBroadcast" и "setSoTimeout"

Разумеется, что bind () генерирует IOExceotion, поскольку сокет уже связан при создании?

Измените новый DatagramSocket(null) на новый DatagramSocket (широковещательный); удалить вызов bind (); и измените первый аргумент нового InetSocketAddress() с 0.0.0.0 на ноль.

Другие вопросы по тегам