Клиент осуществил широковещательную рассылку запроса по всем подключенным к нему интерфейсам, способным выполнять широковещательную рассылку, и теперь должен ждать ответов. Для установки периода ожидания входящих сообщений до 3 секунд применяется модуль IO::Select. Если в течение этого времени не будет получено ни одного ответа, возвращается значение undef. В ином случае считывается первое сообщение, распаковывается и выполняется проверка, содержит ли оно ожидаемый код error, поступивший от сервера системы интерактивной переписки (если оно не содержит такого кода, это может означать, что запросы через этот порт принимает сервер какого-то другого типа). Теперь подпрограмма определяет и возвращает адрес отправителя путем вызова функции sockaddr_in (), распаковки имени другого участника обмена данными, возвращенного функцией recv(), и использования функции inet_ntoa () для преобразования адреса в форму четырех чисел, разделенных точками, которая предназначена для восприятия человеком.
Если на широковещательный запрос отвечают два или более серверов системы интерактивной переписки, то клиент подключается к первому из них, например, к хосту где размещена страница. Ответы, полученные от других серверов, отбрасываются вместе с сокетом, когда эта подпрограмма выходит из области определения.
После запуска этого дополненного сценария клиента системы интерактивной переписки на хосте, подключенном к двум подсетям, можно видеть, как клиент рассылает широковещательные пакеты по обеим подсетям. Через короткий интервал времени клиент получает ответ от сервера в одной из подсетей и выбирает его. Остальная часть сеанса интерактивной переписки протекает, как обычно.
Итак, широковещательная рассылка - мощный метод поиска ресурсов в локальной сети. Отправка широковещательных пакетов является несложной задачей, если известен правильный широковещательный IP-адрес подсети. В ином случае этот адрес можно определить во время выполнения с использованием модуля IO::Interface (либо рассматриваемой здесь версии, написанной только на языке Perl, либо модуля расширения С, который может быть получен из архива CPAN).