Libuv - несколько TCP-запросов на одном соединении

Используя Libuv, я реализовал TCP-сервер A, который вызывает другой TCP-сервер B.

Поскольку сервер A продолжает получать запросы, я отправляю запросы на сервер B, используя одно соединение TCP, установленное между A и B.

Учитывая, что Libuv является асинхронным и ориентированным на обратный вызов, как мне отличить ответы, которые я получаю от сервера B? т. е. как отправить правильный результат обратно клиенту сервера А?

В документах говорится, что обратный вызов uv_read_cb будет вызываться несколько раз. Как узнать, для какого исходного запроса запрашивается uv_read_cb?


person jeffreyveon    schedule 31.08.2015    source источник
comment
Какой протокол находится поверх TCP? Не существует протокола нейтрального способа сделать это. То, как вы мультиплексируете HTTP-запросы, например, полностью отличается от того, как вы мультиплексируете SMTP-запросы.   -  person David Schwartz    schedule 31.08.2015


Ответы (1)


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

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

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

person Luaan    schedule 31.08.2015