Любопытно отметить, что хост, на котором была выполнена команда эхо тестирования, ответил не через свой сетевой интерфейс, 143.48.31.42, а через интерфейс петли обратной связи, 127.0.0.1. Это может служить иллюстрацией того, что при использовании протокола UDP операционная система вправе выбирать наиболее эффективный маршрут к месту назначения и не обязана отвечать на сообщения именно через тот интерфейс, из которого эти сообщения были получены. Как отмечалось ранее сообщения могут инициироваться любым хостом, например, системой автоматической таргетинговой рекламы http://hiconversion.ru/ .
Отправка широковещательных сообщений
Для отправки широковещательных пакетов необходимо выполнить следующие действия.
Для этого может применяться либо вызов встроенной функции setsockopt (), либо унифицированный метод sockopt() модуля IO::Socket.
Поиск широковещательного адреса подсети (необязательный этап). Каждая подсеть имеет свой широковещательный адрес. В программе можно просто жестко закодировать соответствующий адрес для своей подсети (или предусмотреть ввод его пользователем во время выполнения). Однако для обеспечения лучшей переносимости желательно выполнять поиск соответствующего широковещательного адреса программным путем. Ниже будет описано, как это сделать.
Вызов функции send () для отправки данных по широковещательному адресу. Для создания упакованного адреса назначения, состоящего из широковещательного адреса и выбранного номера порта, применяется функция sockaddr__in (). Передайте упакованный адрес функции send() для широковещательной рассылки сообщения по всей подсети.
В листинге показан простой клиент службы эхо-повтора, разработанный на основе сценария мультиплексного клиента, приведенного ранее. Он считывает из дескриптора STDIN данные, введенные пользователем, и выполняет широковещательную рассылку этих данных по жестко закодированному широковещательному адресу. По мере поступления ответов он выводит IP-адрес и номер порта каждого хоста, ответившего на сообщение, с указанием длины возвращенных данных. Проведем анализ программы.
Строки 1-3. Загрузка модулей. Выполняется загрузка определений из модулей IO::Socket и IO::Select.