Для архитектуры UDP-сервера, которая будет иметь долговременные соединения, одна архитектура должна иметь один сокет, который прослушивает весь входящий UDP-трафик, а затем создавать отдельные сокеты для каждого подключения с помощью connect () для установки удаленного адреса. Мой вопрос в том, можно ли сделать это атомарно аналогично тому, что accept () делает для TCP.
Причина создания отдельного сокета и использования connect () заключается в том, что это упрощает распределение обработки пакетов по нескольким потокам, а также упрощает прямое связывание сокета со структурами данных, которые необходимы для обработки. Логика демультиплексирования в сетевом стеке направляет входящие пакеты в самый конкретный сокет.
Теперь мой вопрос в основном заключается в том, что происходит, когда кто-то хочет эмулировать accept () для UDP следующим образом:
Используйте select () с fd-set, который включает сокет сервера UDP.
Затем прочтите пакет из сокета сервера UDP.
Затем создайте новый сокет UDP, который затем подключается () к удаленному адресу.
Я вызываю select () с помощью набора fd, который включает оба сокета.
Что возвращается?
учитывая, что пакет приходит в ОС где-то между 1 и 3.
Будет ли пакет демультиплексирован в сокет сервера UDP или он будет демультиплексирован в более конкретный сокет, созданный в 3. То есть, в какой момент происходит демультиплексирование? Когда приходит пакет, или это должно происходить «как будто» он прибыл в точку 4?
Последующий вопрос на случай, если вышеперечисленное не сработает: как лучше всего это сделать?