Получение и фильтрация пакетов UDP с одним и тем же портом назначения от нескольких пиров - PullRequest
1 голос
/ 17 мая 2019

У меня есть два независимых сетевых партнера, которые отправляют видеоданные по 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)Беркли пакетный фильтр

Это разумный подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...