我在实现一个简单的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个字节,并且连接挂起。Web浏览器一直等待响应,服务器也在等待,我不知道它在等什么。
如果取消注释(1),则会读取整个请求(并附加到
data_
),但它永远不会停止-我必须在浏览器中取消请求,然后才会运行else {}
部分-我在stdout上看到我的请求。
问题1:我应该如何处理大型请求?问题2:我应该如何缓存请求(当前我将缓冲区附加到字符串)?
问题3:我如何知道请求何时结束?在HTTP中总会有一个响应,因此我的Web浏览器会一直等待它并且不关闭连接,但是我的服务器如何知道请求已经完成(并可能关闭它或回复“200 OK”)?