2017-01-22 4 views
2

У меня есть несколько считывателей на одной системе, которые привязываются к одному адресу (IP: порт, например, 239.0.0.1:1234). Другой компьютер в группе отправляет в эту группу многоадресный пакет UDP, и читатели должны его получить. Я использовал сетевой стек GLib 2.0, g_socket_bind с allow_reuse установлен на true.поведение g_socket_bind в многоадресной рассылке UDP

Когда есть один считыватель (один сокет, привязанный к этому адресу) или до трех считывателей, все в порядке, и читатели будут получать пакеты правильно. Но когда число читателей увеличивается до четырех или выше, потеря пакетов происходит и линейно увеличивается с количеством считывателей в системе.

Если socket является гнездом UDP, то allow_reuse определяет, могут ли другие сокеты UDP одновременно связываться с одним и тем же адресом. В частности, вы можете иметь несколько сокетов UDP, привязанных к одному и тому же адресу, и все они будут получать все пакеты многоадресной рассылки и широковещательные пакеты, отправленные на этот адрес.

Как указано в GIO Reference Manual, когда allow_reuse установлен верно, все считыватели должны считывать все данные, но это не так, как указано выше.

Кто-нибудь знает, в чем проблема? Есть ли проблема, связанная с ядром?

+0

Являются ли ваши приемные устройства медленными? Это может объяснить потерю пакетов UDP, если у них также достаточно трафика ... Если их можно отладить, отключив медленную обработку, чтобы увидеть, не потеряли ли вы потери пакетов. – jku

+1

нет, обработчики приема не медленны, я тестировал их без какой-либо обработки, но ошибка все еще существует –

ответ

1

Все ваши сокеты должны присоединиться к группе многоадресной передачи. Если вы просто полагаетесь на привязку, чтобы повлиять на это, вы попадаете в неопределенное поведение.

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