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