У меня есть два независимых сетевых партнера, которые отправляют видеоданные по UDP на один хост, оба используют один и тот же порт назначения.
Например,
protocol src_addr src_port dst_addr dst_port
UDP peer1 ephemeral host1 5555
UDP peer2 ephemeral host1 5555
Я могу иметь один сокет для приема обоих потокови отправлять видеоданные в соответствующий механизм декодирования на основе src_addr
;но как лучше всего добиться того же результата без одного сокета приема (что желательно, потому что я бы предпочел, чтобы оба декодера были независимыми приложениями)?
Такое ощущение, что так и должно бытьвозможно, потому что каждый поток видеоданных однозначно идентифицирован в приведенной выше таблице.
Основная проблема заключается в том, что bind()
дает сбой, когда два сокета в двух отдельных приложениях приема пытаются подключиться к одному и тому же порту.
Опции:
1) SO_REUSEADDR
и connect()
Можно ли использовать SO_REUSEADDR
, чтобы оба сокета могли подключаться к одному и тому же порту?Будет ли последующий вызов connect()
фильтровать соответствующие дейтаграммы для соответствующего приложения?Или все датаграммы все еще будут доставлены в первый сокет?
2) SO_REUSEPORT
и connect()
SO_REUSEPORT
, кажется, используются для достижения вышеупомянутых целей, например:балансировки нагрузки.Как выбрать приемный сокет?И будет ли он уважать connect()
?
Беглый взгляд на код в ядре Linux (net/core/sock_reuseport.c
) показывает, что он выбирается случайным образом, если не установлен фильтр пакетов Беркли.
3)Беркли пакетный фильтр
Это разумный подход?