Отправка широковещательных сообщений UDP
Как отправлять широковещательные сообщения UDP
Датаграммы UDP можно отправлять как широковещательные. Широковещательное сообщение вместо конкретного сетевого хоста адресуется группе хостов в сети.
Объект sock. поддерживает широковещательные сообщения канального уровня. В таких пакетах MAC-адрес назначения равен 255.255.255.255.255.255. Широковещательные сообщения канального уровня получают все сетевые хосты, подключённые к текущему сегменту сети. Они не проходят через маршрутизаторы, мосты и т. п.
Чтобы сокет отправлял исходящие датаграммы UDP как широковещательные, задайте свойству sock.targetbcast значение 1 - YES:
...
sock.targetbcast= YES
sock.setdata("ABC") 'this is explained in 'Working With Buffers' section
sock.send 'this is explained in 'Working With Buffers' section
sock.connect 'broadcast UDP datagram with string 'ABC' will be sent out at this point
...
Есть одно отличие, которое нужно усвоить для сокета, отправляющего исходящие пакеты как широковещательные: никакой входящий пакет UDP, который обычно был бы истолкован как повторное подключение, не заставит сокет «переключиться» на IP-адрес источника пакета.
Рассмотрим два примера.
Пример 1: обычный обмен по UDP
Вот пример настройки сокета UDP:
sock.protocol= PL_SOCK_PROTOCOL_UDP
sock.inconmode= PL_SOCK_INCONMODE_ANY_IP_ANY_PORT
sock.reconmode= PL_SOCK_RECONMODE_3
sock.targetip= "192.168.100.40"
sock.targetport= 1000
sock.localportlist= "2000"
sock.setdata("ABC")
sock.send
sock.connect
А вот гипотетическая последовательность событий:
| Входящая/исходящая датаграмма | Комментарий |
| Датаграмма с содержимым «ABC» отправляется на 192.168.100.40:1000 сразу после вызова метода sock.connect. | Теперь у нас есть «соединение» UDP с 192.168.100.40:1000. |
| Входящая датаграмма UDP от 192.168.100.41:20. | Она будет воспринята как повторное подключение - теперь сокет занят соединением с 192.168.100.41:20. |
| Сокет отправляет ещё одну датаграмму - на этот раз на 192.168.100.41:20! | Произошло полное переключение - сокет теперь передаёт данные на IP-адрес и порт отправителя предыдущей входящей датаграммы. |
Пример 2: обычный обмен по UDP
Вот другая настройка сокета UDP:
sock.protocol= PL_SOCK_PROTOCOL_UDP
sock.inconmode= PL_SOCK_INCONMODE_ANY_IP_ANY_PORT
sock.reconmode= PL_SOCK_RECONMODE_3
sock.targetbcast= YES
sock.targetport=1000
sock.localportlist= "2000"
sock.setdata("ABC")
sock.send
sock.connect
Последовательность событий:
| Входящая/исходящая датаграмма | Комментарий |
| Датаграмма с содержимым «ABC» отправляется как широковещательная всем станциям сегмента сети. | Теперь у нас «соединение» UDP с... э-э... всеми в сегменте. |
| Входящая датаграмма UDP от 192.168.100.41:20. | Это по-прежнему повторное подключение, но сокет не переключится на IP-адрес отправителя. Произойдёт только переключение порта! |
| Сокет отправляет ещё одну датаграмму - по-прежнему широковещательную, но на этот раз на порт 20. | Переключение порта произошло, потому что это разрешено в sock.reconmode. |