функции get_ifi_info для получения информации об интерфейсе
11-12
Функция
get_ifi_info
получает все адреса IPv4, включая дополнительные (псевдонимы), для всех интерфейсов. Затем программа перебирает все структуры
ifi_info
.
Создание сокета UDP и связывание адреса направленной передачи
13-20
Создается сокет UDP, и с ним связывается адрес направленной передачи. Мы также устанавливаем параметр сокета
SO_REUSEADDR
, поскольку мы связываем один и тот же порт (параметр
SERV_PORT
) для всех IP-адресов.
ПРИМЕЧАНИЕ
Не все реализации требуют, чтобы был установлен этот параметр сокета. Например, Беркли-реализации не требуют этого параметра и позволяют с помощью функции bind связать уже связанный порт, если новый связываемый IP-адрес не является универсальным адресом и отличается от всех IP-адресов, уже связанных с портом. Однако Solaris 2.5 для успешного связывания с одним и тем же портом второго адреса направленной передачи требует установки этого параметра.
Порождение дочернего процесса для данного адреса
21-24
Вызывается функция
fork
, порождающая дочерний процесс. В этом дочернем процессе вызывается функция
mydg_echo
, которая ждет прибытия любой дейтаграммы на сокет и отсылает ее обратно отправителю.
В листинге 22.14 показана следующая часть функции
main
, которая обрабатывает широковещательные адреса.
Листинг 22.14. Вторая часть сервера UDP, который с помощью функции bind связывается со всеми адресами
Если интерфейс поддерживает широковещательную передачу, создается сокет UDP и с ним связывается широковещательный адрес. На этот раз мы позволим функции
bind
завершиться с ошибкой
EADDRINUSE
, поскольку если у интерфейса имеется несколько дополнительных адресов (псевдонимов) в одной подсети, то каждый из различных адресов направленной передачи будет иметь один и тот же широковещательный адрес. Подобный пример приведен после листинга 17.3. В этом сценарии мы предполагаем, что успешно выполнится только первая функция
bind
.
Порождение дочернего процесса
43-47
Порождается дочерний процесс, и он вызывает функцию
mydg_echo
.
Заключительная часть функции
main
показана в листинге 22.15. В этом коде при помощи функции
bind
происходит связывание с универсальным адресом для обработки любого адреса получателя, отличного от адресов направленной и широковещательной передачи, которые уже связаны. На этот сокет будут приходить только дейтаграммы, предназначенные для ограниченного широковещательного адреса (255.255.255.255).
Листинг 22.15. Заключительная часть сервера UDP, связывающегося со всеми адресами