Как реализовать неблокирующую модель связи клиент-сервер с параллельным запросом и ответами на одном сокете без гонки данных

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

И могу ли я добавить, что это многопоточное приложение (Икс клиенты на 1 сервер), и поэтому я хочу иметь возможность отправлять запрос на сервер одновременно, не ожидая предыдущую запись / отправку, но в то же время иметь возможность получить ответ на тот же сокет. Я надеюсь это имеет смысл.

Последний выбор, который у меня есть, — это использование HTTP-модели подключения / приема > Запрос / служить > близко за каждый запрос.

PS: я не ищу код

1

Решение

Я делаю это так, чтобы иметь поток ввода-вывода, который является единственным потоком, которому разрешено чтение или запись в сокет. Эти потоки хранят очередь FIFO исходящих запросов-сообщений и записывают данные из (главы этой очереди) в сокет всякий раз, когда сокет select () готов для записи, и читают из сокета всякий раз, когда сокет select () готов для чтения.

Другие потоки могут добавлять сообщение в конец очереди исходящих запросов потока ввода-вывода в любое время (обратите внимание, что вам нужно будет синхронизировать эти добавления с потоком ввода-вывода через мьютекс или что-то еще, а также, если исходящие -requests-queue была пуста до того, как новый запрос был добавлен в него, вам понадобится механизм для пробуждения потока ввода-вывода, чтобы он мог начать отправку нового запроса, запись байта в самоподключенную пару сокетов, которая поток ввода / вывода select () на другом конце будет работать для этой цели)

Для другого направления: когда поток ввода-вывода имеет recv () d полное сообщение из сокета, он должен доставить полученное сообщение в соответствующий рабочий поток; это также должно быть сделано с помощью какого-то поточно-безопасного механизма, но реализация этого будет зависеть от того, как реализован принимающий поток.

2

Другие решения


По вопросам рекламы [email protected]