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