У меня есть 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
.