Как получить широковещательный пакет на 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.


person simon    schedule 28.06.2012    source источник
comment
Вы используете один и тот же сокет для отправки и получения, верно?   -  person selbie    schedule 29.06.2012
comment
это может вызвать проблемы? я должен получить на другой сокет?   -  person simon    schedule 29.06.2012
comment
Нет, оставить ту же розетку. Двумя будет сложнее.   -  person selbie    schedule 30.06.2012


Ответы (2)


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

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

person user207421    schedule 28.06.2012
comment
исключение не выбрасывается. Я внес предложенные вами изменения, но ничего не изменилось. Пакет приходит, но сокет его не получает. Если я настрою wlan0 с IP-адресом, все будет работать, если я настрою его на групповой адрес 0.0.0.0, это не сработает. Кажется, что невозможно получать широковещательные рассылки в сокете, привязанном к подстановочному адресу.. это правда? любое решение? - person simon; 29.06.2012
comment
@EJP new DatagramSocket(null) предотвращает его привязку к адресу. Вы имеете в виду, когда используется new DatagramSocket() (непараметризованный конструктор по умолчанию), который привязывает его к порту, выделенному системой. - person Abraham Philip; 29.09.2016

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

person selbie    schedule 29.06.2012
comment
Ничего не изменилось. Я проверяю, включен ли SO_BROADCAST, и это так. Я не думаю, что это проблема привязки. Я осмотрелся, и кажется, что в java невозможно получать широковещательные пакеты в сокете, привязанном к подстановочному адресу, на ненастроенном интерфейсе. Это правда? вы знаете какое-нибудь решение? - person simon; 29.06.2012