Как дублировать пакеты UDP на два или более сокетов - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь запустить два демона на одном и том же порту и IP, но один - сервер, а другой - клиент. Есть ли метод, использующий параметры сокета, который позволял бы каждому сокету иметь копию пакета и позволял демонам отфильтровывать сообщения на основе протокола? Похоже, адрес повторного использования блокирует первый настроенный порт, и порт повторного использования может просто сбалансировать пакет между двумя демонами.

В противном случае, я думаю, создайте еще один демон для чтения сокета и отправьте пакеты правильному демону.

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Если UDP-пакеты, которые вы получаете, являются многоадресными или широковещательными пакетами, то вы можете установить SO_REUSEADDR (и, для ОС на базе BSD, SO_REUSEPORT) на сокете (используя setsockopt()) перед bind () - В этом случае оба сокета получат копию каждого входящего пакета UDP. (Если UDP-пакеты являются обычными старыми одноадресными пакетами, OTOH, то выполнение вышеизложенного приведет к тому, что каждый полученный пакет будет получен только одним из двух сокетов UDP, а это не то, что вам нужно).

Заметьте, однако: вы называете эти два демона «клиентом» и «сервером» - смысл этих терминов заключается в том, что два демона будут взаимодействовать друг с другом. Если это так, то типичный подход заключается в том, чтобы сервер-демон связывался с хорошо известным номером порта, а клиент-демон мог связываться с любым номером порта (например, он мог передать 0 в качестве номера порта для bind(), и пусть ОС выберет для него доступный номер порта). Затем клиент-демон может начать диалог, отправив один или несколько пакетов UDP на известный номер порта сервера, и сервер может выяснить, с какого порта отправляется клиент (и, следовательно, с какого порта отправлять ответные пакеты), исследуя пятый аргумент его recvfrom() вызова. В этом случае нет необходимости связывать две программы с одним и тем же портом и, следовательно, нет необходимости в пересылке пакетов.

0 голосов
/ 15 января 2019

В конце вы правы, вам понадобится третья часть, которая связывается с портом и передает пакеты правильному демону.

Другой способ сделать это - использовать три порта и использовать брандмауэр для перенаправления с внешнего порта на внутренние порты; но это намного сложнее и не переносимо. Но, в конце концов, вы можете использовать QOS или что-то в этом роде. За протоколом word существует широкий спектр возможных типов использования.

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