Этот вопрос может быть немного не по теме, но я не знал, где еще спросить. Я читал это 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, поэтому я не знаю, как это делается.
Все это во многом так, как работает большинство реализаций HTTP. Обратите внимание на тайм-ауты на обоих концах, чтобы контролировать использование ресурсов простоя каждого конца.
Других решений пока нет …