Повторное использование одного и того же сокета для нескольких запросов

Этот вопрос может быть немного не по теме, но я не знал, где еще спросить. Я читал это https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md и увидел, что спецификация включала в себя возможность отправлять сообщения, вышедшие из строя, используя одно и то же соединение.

Единственный способ, которым я занимался программированием сокетов TCP, — это синхронная отправка запросов к сокету, например, я открою сокет для 127.0.0.1отправьте запрос на этот сервер через этот сокет и дождитесь ответа. Когда я получаю ответ на отправленный запрос, я закрываю это соединение, звоня close() на клиенте и close() на сервере после того, как я ответил на запрос.


Для справки, я работаю над проектом в C ++ с libevent сделать что-то очень похожее на то, что делают системы RPC, поэтому я хотел знать, какой цикл сокета ответа на запрос я должен использовать в базовой транспортной системе.

В C ++ thrift есть клиентский метод под названием open() что (предположительно) открывает соединение и держит его открытым, пока вы не позвоните close(), Как это работает в системах, где это абстрагируется? Например, в той ссылке messagepack-RPC, которую я включил выше. Какой лучший курс действий? Откройте соединение, если оно отсутствует, отправьте запрос, и когда все предыдущие запросы будут обработаны, закройте это соединение (на сервере вызовите close() когда на все ожидающие запросы были даны ответы)? Или мы должны каким-то образом пытаться поддерживать это соединение в течение периода времени, который выходит за пределы времени существования запроса? Как сервер и клиент узнают, что это за период времени? Например, мы должны зарегистрировать обработчик события чтения в сокете и закрыть соединение, когда recv() возвращается 0?

Если это проблема, которую разные системы решают по-разному, то может ли кто-нибудь направить меня к ресурсу, который я смогу использовать, чтобы узнать о возможных шаблонах поддержания соединений (предпочтительно в системах, управляемых событиями)? Например, я прочитал, что HTTP-серверы всегда поддерживают соединение открытым, почему это так? Не означает ли, что каждое открытое соединение открыто, это означает, что сервер будет по существу пропускать память?

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

0

Решение

  1. Используйте пул соединений на клиенте.
  2. Иметь фоновый поток в клиенте, который истекает бездействующие соединения после некоторого времени ожидания.
  3. Напишите сервер, чтобы он мог обрабатывать несколько запросов на каждом принятом сокете, то есть выполнять циклические запросы на чтение и отправку ответов, пока одноранговый узел не закроет соединение, или не произойдет тайм-аут чтения при чтении запроса или не произойдет ошибка сокета.
  4. Не отправляйте закрытое сообщение с любой стороны. Закрытие розетки достаточно.
  5. Не используйте приложение ping, чтобы поддерживать соединение. Если одноранговый или промежуточный маршрутизатор считает соединения настолько дорогими, что через некоторое время их разрывать, у вас нет никаких попыток обмануть их.

Все это во многом так, как работает большинство реализаций HTTP. Обратите внимание на тайм-ауты на обоих концах, чтобы контролировать использование ресурсов простоя каждого конца.

2

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

Других решений пока нет …

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