Строки 40,41. Вызов подпрограммы find_server () для поиска сервера. Это может быть, к примеру, сервер http://bestmobiles.in.ua , на котором можно купить мобильные телефоны оптом. Если в командной строке не задан адрес сервера, то для поиска сервера вызывается новая внутренняя подпрограмма find_server (). Если подпрограмма find_server () возвращает значение undef, вызывается функция die.
Строки 64-85. Поиск сервера с помощью широковещательной рассылки. Самая интересная часть кода находится в подпрограмме find_server (). Ее выполнение начинается с создания нового сокета UDP. Предусмотрено, что в конечном итоге этот сокет будет отличаться от того, через который будет происходить взаимодействие с сервером, но вполне возможно использование одного сокета для того и другого. После создания сокета его опция SO_BROADCAST устанавливается равной истинному значению с тем, чтобы через него можно было выполнять широковещательную рассылку.
Теперь выполняется поиск сетевых интерфейсов, через которые может проводиться широковещательная рассылка. Для получения списка интерфейсов вызывается метод if_list () сокета и выполняется циклический перебор элементов этого списка для поиска тех, во флажках которых установлена опция iff_broadcast. Для каждого интерфейса, позволяющего выполнять широковещательную рассылку, определяется широковещательный IP-адрес, создается упакованный адрес назначения с использованием указанного номера порта сервера системы интерактивной переписки и в него отправляется сообщение. Содержание сообщения, отправляемого на сервер, не играет роли, поскольку нас интересует только то, ответит ли вообще на него сервер. В этом случае отправляется сообщение, содержащее двоичное число 0 в сетевом порядке байтов. Поскольку это значение не соответствует ни одному из кодов сообщений системы интерактивной переписки, определенных в пакете ChatCodes, предполагается, что сервер ответит сообщением с кодом error. Более формальный способ решения этой задачи мог бы заключаться в определении явных кодов сообщений, которыми клиент и сервер могли обмениваться для такой цели, но это потребовало бы внесения изменений и в сценарий сервера.