У меня возникли трудности с реализацией простого TCP-сервера. Следующий код взят из примеров boost::asio, точнее "Http Server 1".
void connection::start() {
socket_.async_read_some(
boost::asio::buffer(buffer_),
boost::bind(
&connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
}
void connection::handle_read(const boost::system::error_code& e, std::size_t bytes_transferred) {
if (!e && bytes_transferred) {
std::cout << " " << bytes_transferred <<"b" << std::endl;
data_.append(buffer_.data(), buffer_.data()+bytes_transferred);
//(1) what here?
socket_.async_read_some(
boost::asio::buffer(buffer_),
boost::bind(
&connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
}
else// if (e != boost::asio::error::operation_aborted)
{
std::cout << data_ << std::endl;
connection_manager_.stop(shared_from_this());
}
}
В исходном коде buffer_
достаточно большой, чтобы сохранить весь запрос. Это не то, что мне нужно. Я изменил размер на 32 байта.
Сервер компилирует и прослушивает порт 80 локального хоста, поэтому я пытаюсь подключиться к нему через веб-браузер.
Теперь, если оператор (1) закомментирован, то читаются только первые 32 байта запроса и соединение зависает. Веб-браузер продолжает ждать ответа, сервер ждет... Я не знаю что.
Если (1) не закомментирован, то весь запрос читается (и добавляется к data_
), но он никогда не останавливается — мне нужно отменить запрос в моем браузере, и только тогда запускается часть else { }
— я вижу свой запрос на стандартном выходе.
Вопрос 1. Как мне обработать большой запрос?
Вопрос 2. Как мне кэшировать запрос (в настоящее время я добавляю буфер к строке)?< br/> Вопрос 3: Как узнать, что запрос выполнен? В HTTP всегда есть ответ, поэтому мой веб-браузер продолжает ждать его и не закрывает соединение, но как мой сервер может узнать, что запрос завершен (и, возможно, закрыть его или ответить «200 OK»)?