http-сервер пион избегать TIME_WAIT

Я работаю на http-сервере и клиенте, использую библиотеку pion c ++ (5.0.6) на Win32.

Проблема в том, что после отключения клиента он всегда остается TIME_WAIT на стороне сервера. netstat -ano. Иногда на моем сервере около 10000 TIME_WAIT, и мои клиенты могут чувствовать отставание, я не знаю, связано ли это с TIME_WAIT.

Я написал простой сервер / клиент, чтобы проиллюстрировать проблему

сервер:

#pragma once
#include <iostream>
using namespace std;

#include <exception>
#include <boost/asio.hpp>
#include "pion/http/request.hpp"#include "pion/http/response.hpp"#include "pion/tcp/connection.hpp"#include "pion/http/server.hpp"#include "pion/http/response_writer.hpp"using namespace pion;

#define SERVER_PORT 8080

struct my_server {
pion::http::server_ptr m_server;

void start() {
m_server = pion::http::server_ptr(new pion::http::server(SERVER_PORT));

m_server->add_resource("/hello", boost::bind(&my_server::hello, this, _1, _2));

m_server->start();
}

void hello(http::request_ptr& req, tcp::connection_ptr& conn) {
http::response_writer_ptr writer(
http::response_writer::create(
conn,
*req,
boost::bind(&tcp::connection::finish, conn)));
http::response& r = writer->get_response();
r.set_status_code(pion::http::types::RESPONSE_CODE_OK);
r.set_status_message(pion::http::types::RESPONSE_MESSAGE_OK);

writer->write("YES from server");
writer->send();
}
};

int main() {
my_server svr;
try {
svr.start();
} catch(std::exception e) {
cout <<"exception: " << e.what() << endl;
exit(1);
}
while(1) {
Sleep(10);
}
}

клиент:

#include <exception>
#include <iostream>
using namespace std;
#include <boost/asio.hpp>
#include "pion/http/request.hpp"#include "pion/http/response.hpp"#include "pion/tcp/connection.hpp"
#define MM_SERVER_IP "192.168.0.5"#define MM_SERVER_PORT 8080

boost::asio::io_service io_service;

void http_post(const std::string& url, const std::string& content)
{
using namespace boost;
using boost::asio::ip::tcp;

tcp::endpoint endpoint(boost::asio::ip::address::from_string(MM_SERVER_IP), MM_SERVER_PORT);
pion::tcp::connection con(io_service);

boost::system::error_code ce = con.connect(endpoint);
if(ce) {
return;
}

pion::http::request req(url);
req.set_method(pion::http::types::REQUEST_METHOD_POST);

req.set_content(content);

// send;
boost::system::error_code err;
req.send(con, err);
if(err) {
return;
}

// recv
pion::http::response resp(req);
resp.receive(con, err);
cout.write(resp.get_content(), resp.get_content_length());
cout << endl;

con.close();
}

int main() {
http_post("/hello", "hello");
Sleep(3000);
}

Я думаю, что сервер в порядке, потому что все идет хорошо, если я подключусь к серверу с помощью веб-браузера, такого как Chrome, после закрытия Chrome не будет TIME_WAIT. Но код клиента всегда остается TIME_WAIT.

Что мне не хватает для клиентского кода?

0

Решение

Вам нужно прочитать RFC 2616. Все это. Особенно часть об управлении соединением. Сервер должен поддерживать HTTP keepalive по умолчанию. Частично это то, что сервер решает, когда прервать соединение после отправки ответа. Конец, который отправляет первое закрытие, не требует TIME_WAIT, поэтому полезно, если это сервер: либо сразу после ответа в случае Connection: close, либо после тайм-аута в случае Connection: keepalive. По той же причине ваш клиент должен реализовать пул HTTP-соединений.

0

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


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