LIBUV: проблема SO_REUSEPORT в Linux

У меня есть UDP-сервер в C на основе libuv, у нас есть:

  • Основной поток: получает пакет UDP, ставит его в очередь в одну из 4 очередей и вызывает обратный вызов для удаления из очереди одному из 4 рабочих процессов. Основной поток bind() на порт 9930
  • 4 рабочих потока: удаляется из соответствующей очереди при вызове обратного вызова и отправляет ответ. Каждый поток также привязывается к одному и тому же адресу

Теперь, когда я отправляю запрос (src_port:A и dest_port:9930) на сервер UDP, сервер отвечает пакетом UDP с src_port:B и dest_port:A. Я хочу, чтобы B было равно 9930.

Я просмотрел несколько статей в Интернете и установил флаг UV_UDP_REUSEADDR в uv_udp_bind() как для основного потока, так и для 4 рабочих потоков. Но теперь сервер udp не всегда принимает запрос, даже не вызываются обратные вызовы приема. Иногда это происходит, и в этих случаях поток подходит для порта B=9930.


person melwin_jose    schedule 28.08.2015    source источник


Ответы (1)


Теперь, когда я отправляю запрос (src_port:A и dest_port:9930) на сервер UDP, сервер отвечает UDP-пакетом с src_port:B и dest_port:A. Я хочу, чтобы B было равно 9930.

Затем сервер должен ответить из сокета, привязанного к порту 9930. Например. ответить из того же сокета, который получил запрос.

Кроме того, рабочие потоки могут совместно использовать один и тот же сокет, открытый основным потоком. Когда несколько потоков получают данные из одного и того же сокета UDP, только один из них получает дейтаграмму. Также безопасно отправлять несколько потоков в один и тот же сокет UDP.

person Maxim Egorushkin    schedule 28.08.2015
comment
да, это то, что я хочу, но это не так - person melwin_jose; 31.08.2015