Ответ 1
"Семантика Socket требует, чтобы приложение установило параметр SO_BROADCAST, прежде чем пытаться отправить дейтаграмму на базовый или широковещательный адрес. Это защищает приложение от случайной отправки дейтаграммы во многие системы."
Если мы хотим передавать информацию из сокета, нам нужно включить SocketOptions.SO_BROADCAST
. Однако я не понимаю, почему это необходимо.
Насколько я понимаю, мы устанавливаем пакет с широковещательным адресом, точно так же, как и для одноадресного адреса. Тогда нам просто нужно отправить его через обычный сокет. Если его UDP-сокет, то заголовок UDP будет добавлен в этот пакет, а затем заголовок IP, содержащий IP-адрес получателя (в этом случае это широковещательный адрес в форме 192.168.255.255
), а затем MAC-адрес (FF:FF:FF:FF)
.
Я думаю, что маршрутизатор получит пакет и выполнит трансляцию. Я не понимаю, почему нам нужно установить атрибут socket SO_BROADCAST
.
"Семантика Socket требует, чтобы приложение установило параметр SO_BROADCAST, прежде чем пытаться отправить дейтаграмму на базовый или широковещательный адрес. Это защищает приложение от случайной отправки дейтаграммы во многие системы."
В большинстве случаев эти вызовы просто вызывают одно и то же в ОС. Вероятно, это будет ограничение вашей ОС, а не Java.