Вопрос может немного не по теме, но я не знал, где еще спросить. Я читал это 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, поэтому я мог не знать, как это делается.
close()
вызове пользователя, например, в экономном клиенте, о котором я говорил. Итак, сервер знает, что он может вызыватьclose()
в сокете? - person Curious   schedule 07.06.2017