2014-02-03 3 views
3

Я пытаюсь настроить небольшое тестовое приложение на Linux (Ubuntu) на основе кода, который я написал (и который работал) для Winsock. Как сейчас, это всего лишь небольшой тест, который создает сокет (и, похоже, успешно соединяется) только для вечного верования на recv() вместо получения датаграмм. Это простой блокирующий разъем.UDP-сокет (многоадресный), не получающий данные (Ubuntu)

Вот как я создаю его:

http://pastebin.com/kcCbgxbB

Несколько дополнительных вещей испытываться: - Порт открыт. - Другие приложения могут успешно получать данные из многоадресного адреса.

Таким образом, я ничего не вижу. Помогите с благодарностью :-)

+1

Вы не проверяете все свои вызовы на setsockopt(), чтобы узнать, выполнены ли они или нет. Возможно, один из них терпит неудачу, и это связано с вашей проблемой? –

+0

Хороший момент, я принимал их успех как должное более или менее :) Однако добавленные проверки показывают, что они также успешно работают. – nielsj

+1

Я пробовал, и он отлично работает. – GabiMe

ответ

3

Таким образом, в конце концов, немного конфигурации системы и исправление ошибок прошли долгий путь:

а) Как корень, я должен был сделать следующее, чтобы отключить обратный фильтр пакетов: эха 0>/прок/sys/net/ipv4/conf/all/rp_filter + То же самое для ethX.

б) Добавить фиктивный маршрут для ethX (маршрут добавить -сетью 224.0.0.0. 224.0.0.0 маска подсети ethX)

с) Свяжите сокет IP в чтобы быть присоединился к группе (в противном случае любой последующий socket будет получать все пакеты из всех групп, которые я присоединил к этому конкретному порту).

d) Установите член интерфейса структуры ip_mreq на IP-адрес адаптера, который мы получаем.

А потом все было хорошо и денди, тест проходит быстро & плавный (вытягивание 125 многоадресных транспортных потоков @ около 800-900 мбит - уверен, что это может быть умнее, но все же). Спасибо за все указатели.

5

В системах Unix при использовании сокета для многоадресной рассылки вы должны привязываться к INADDR_ANY, а не к интерфейсу.

Многоадресная фильтрация по интерфейсу (т. Е. Не принимает mcast с других интерфейсов, чем указанный) уже установлена, потому что вы правильно заполняете imr_interface.

+1

Я бы не назвал это «фильтрацией» точно. 'imr_interface' выбирает интерфейс, через который отправляется IGMP JOIN: другими словами, какая подсеть знает о вашем членстве. Если вы разрешите его по умолчанию, вы разрешите статическим таблицам маршрутизации IP, что в большинстве случаев является правильным. В многодомном хосте может потребоваться выпуск соединения для каждого интерфейса. – EJP

+1

Во всех случаях возможное программное обеспечение будет использоваться на многоточечных системах. Тем не менее, на Winsock INADDR_ANY действительно работает отлично. При привязке сокета к ANY и интерфейсу к конкретному IP-адресу NIC, однако объединение групп всегда терпит неудачу. - Но да, я сейчас вернусь к INADDR_ANY. – nielsj

Смежные вопросы