Я не смог найти рабочий пример для этого, поэтому я собираюсь опубликовать вопрос (и давайте посмотрим, смогу ли я сократить его до примера кода MVP). Итак, мне нужно сделать запросы mdns, я могу использовать два сокета (один для отправки / второй для получения), но пока мне не удалось заставить его работать с одним сокетом.
Итак, шаги, которые я выполняю:
Перечислите все адреса интерфейсов на хосте. Затем для каждого хоста:
- Создайте неблокирующий сокет UDP
- bind() либо на адрес интерфейса: 5353, либо на адрес группы многоадресной рассылки (любой из них приводит к сбою чтения или записи)
- Установите IP_MULTICAST_IF для локального интерфейса
- IP_ADD_MEMBERSHIP в группу многоадресной рассылки
- Добавьте сокеты для чтения/записи в kqueue
Итак, в зависимости от того, что я делаю на шаге 2, чтение или запись завершаются ошибкой:
- Если я привязываю сокет к группе многоадресной рассылки, я получаю уведомления о прочтении из kqueue и могу читать пакеты, но когда я получаю уведомление о записи из kqueue и пытаюсь записать, происходит сбой с ошибкой 49.
- Если я привязываю сокет к адресу интерфейса, я могу отправлять пакеты, но из kqueue никогда не приходят уведомления о прочтении.
Итак, к какому адресу мне нужно привязаться? Кроме того, поскольку параметр IP_ADD_MEMBERSHIP
ip_mreq
имеет поле интерфейса, действительно ли мне нужен IP_MULTICAST_IF
?