Я хочу иметь постоянные соединения TCP с HTTP-сервером POCO

Я использую POCO C ++ lib версии 1.4.3 для реализации HTTP-сервера.
В моем сценарии использования есть только два или три клиента, и я хотел бы иметь постоянные соединения. Клиенты отправляют данные с введенными запросами, а сервер отвечает «HTTP / 1.1 201 Created». Клиенты открывают более одного соединения. Один из клиентов может открыть 20 подключений одновременно.

Я использую значения по умолчанию в HTTPServerParams и Poco :: Net :: ServerSocket (myPort)
и я использую Poco :: ThreadPool (16,48).

Клиент отправляет запрос http put, а сервер отвечает:

Server:
HTTP/1.1 201 Created
Connection: Close
Date: Thu, 31 Jan 2013 15:21:50 GMT

Я видел этот результат в PCAP-файле с WireShark.

Что мне делать, если я не хочу, чтобы сервер закрывал соединение после запроса на установку?

— отредактируйте и вставьте исходный код:

HTTPServer::HTTPServer(uint16_t port,
Poco::Net::HTTPRequestHandlerFactory* handlerFactory):
m_port(port),
m_wasStarted(false)
{
// HTTPServer takes ownership
Poco::Net::HTTPServerParams*   options = new Poco::Net::HTTPServerParams;

try
{
m_threadPool.reset(new Poco::ThreadPool (16,48));

std::cout << "HTTPServerParams.keepAlive: "<< options->getKeepAlive() << std::endl;

std::cout << "HTTPServerParams.keepAliveTimeout: "<< options->getKeepAliveTimeout().totalSeconds() << std::endl;

std::cout << "HTTPServerParams.MaxKeepAliveRequests: "<< options->getMaxKeepAliveRequests()<< std::endl;

std::cout << "HTTPServerParams.Timeout: "<< options->getTimeout().totalSeconds() << std::endl;

m_server.reset(new Poco::Net::HTTPServer(handlerFactory,
*m_threadPool,
Poco::Net::ServerSocket(m_port),
options)
);
}
catch (const Poco::Exception& e)
{
//some code ...
}
}

приватный член из класса HTTPServer:

 uint16_t                                m_port;
bool                                    m_wasStarted;
std::auto_ptr<Poco::ThreadPool>         m_threadPool;
std::auto_ptr<Poco::Net::HTTPServer>    m_server;

3

Решение

Вы пытались использовать setKeepAlive(true); вызов функции-члена для экземпляра Класс HTTPServerParams?

Кстати, посмотрите на setKeepAliveTimeout() функция-член того же класса.

Я обнаружил кое-что интересное: если sendBuffer() функция используется для отправки ответа, тогда ответ содержит Подключение: Keep-Alive значение; но когда send() функция используется ответ содержит Подключение: Закрыть значение.

Итак, интересные детали реализации здесь: росо / Net / SRC / HTTPServerResponseImpl.cpp. Смотрите реализацию send() а также sendBuffer() функции-члены.

4

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

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

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