Я борюсь с двумя созданными мной исполняемыми файлами, которые должны взаимодействовать через многоадресную рассылку. В моей текущей настройке они должны общаться через устройство обратной связи. Для этого я выполнил две команды, прежде чем что-либо начинать:
ifconfig lo multicastroute add -net 224.0.0.0 netmask 240.0.0.0 dev loМое приложение-отправитель делает примерно это, в следующем порядке:
getaddrinfosocketsetsockopt(IP_MULTICAST_LOOP)connectМое приложение для прослушивания делает примерно это, в следующем порядке:
getaddrinfosocketconnectsetsockopt(IP_ADD_MEMBERSHIP)Когда обе программы запущены, помимо wlan0 также активен интерфейс lo.
Мое приложение для прослушивания ничего не получает, когда у меня включен маршрут к 224.0.0.0, но tcpdump получает. Когда я удаляю этот маршрут и перезапускаю приложение для прослушивания, все работает нормально.
Интересно, какие шаги я могу предпринять, чтобы отладить это? Похоже, что мое приложение для отправки всегда отправляет данные через интерфейс wlan0.
«Мое приложение для отправки делает примерно это» не представляет никакого интереса. Требуется именно то, что он делает, как указано в исходном коде. И конкретно не представляет никакого интереса, что вы думаете о том, что он делает. Это не так, иначе вы бы не задавали этот вопрос.
Почему connect, а не listen на сервере?
listen() предназначен специально для TCP-соединений, а многоадресная рассылка происходит через UDP.
Обратите внимание, что connect() часто не является хорошей идеей для многоадресной рассылки, поскольку выполнение connect() на сокете UDP устанавливает фильтр приема на сокете, так что он будет получать только UDP-пакеты, поле IP-адреса источника которых точно соответствует IP-адресу, указанному в вызов connect() и пакеты многоадресной рассылки обычно имеют одноадресный IP-адрес отправителя в качестве IP-адреса источника, а не IP-адрес группы многоадресной рассылки. Я бы предложил закомментировать вызовы connect(), по крайней мере на данный момент, и использовать вместо них sendto() и recvfrom().





Изменение кода для использования send и recv решило проблему для меня.
bindсначала сокеты к IP-адресу локального хоста.