Вызывается функция getprotobyname() для выборки номера протокола IP, применяемого в функциях setsockopt() и getsockopt(). Если номер протокола по каким-то причинам не мог быть получен, он устанавливается по умолчанию равным 0. Таково обычное значение применяемое для константы с номером протокола.
Строки 13-22. Методы new() и configure(). Данные методы модуля перекрываются с тем, чтобы протокол UDP применялся по умолчанию, если параметр явно не задан.
Строки 23-29. Метод mcast_add(). Этот метод в качестве параметров принимает сокет, адрес группы многоадресной рассылки, к примеру, про новости форекс и необязательный параметр с указанием локального интерфейса. Если интерфейс указан, метод вызывает внутреннюю функцию get_if_addr (), которая обеспечивает применение альтернативных способов указания интерфейса. Если интерфейс не указан, то функция get_if__addr () возвращает значение “0.0.0.0”, которое представляет собой безразличный адрес inaddr_any в виде четырех чисел, разделенных точками.
Затем создается структура ip_mreq путем объединения двоичных представлений адреса группы и локального IP-адреса, и эта структура передается методу setsockopt () с уровнем сокета $ip_level и командой ip_add_membership.
Строки 30-36. Метод mcast_drop (). Этот метод содержит тот же код, что и метод mcast_add (), за исключением того, что в самом конце в нем вызывается метод setsockopt () с командой ip_drop_membership.
Строки 37-47. Метод mcast_if (). Этот метод позволяет присвоить или определить интер фейс для исходящих многоадресных сообщений. Если в вызывающей процедуре указан интерфейс, он преобразуется в адрес путем вызова функции get_if_addr (), затем этот адрес превращается в упакованную двоичную версию с использованием функции inet__aton() и вызывается метод setsockopt () с командой ip_multiсast_if.
Для выборки значения интерфейса применяется более сложный метод в связи с ошибкой в коде операционной системы Linux, в результате которой метод getsockopt () возвращает 12-байтовую структуру, а не ожидаемый 4-байтовый упакованный IP-адрес интерфейса (обнаружено это, изучая исходный код ядра).