【发布时间】:2012-09-16 18:41:02
【问题描述】:
我在实现一个简单的 TCP 服务器时遇到了困难。以下代码取自boost::asio examples,确切地说是“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 字节。
服务器编译并监听 localhost 的 80 端口,所以我尝试通过我的网络浏览器连接到它。
现在如果语句 (1) 被注释掉,那么只有请求的前 32 个字节被读取并且连接挂起。 Web 浏览器一直在等待响应,服务器确实在等待。我不知道是什么。
如果 (1) 未注释,则读取整个请求(并添加到 data_),但它永远不会停止 - 我必须在浏览器中取消请求,然后才会运行 else { } 部分 -我在标准输出上看到了我的请求。
问题 1: 我应该如何处理大请求?
问题 2: 我应该如何缓存请求(目前我将缓冲区附加到字符串) ?
问题 3:如何判断请求已结束?在 HTTP 中总是有响应,所以我的网络浏览器一直在等待它并且没有关闭连接,但是我的服务器如何知道请求已经结束(可能关闭它或回复一些“200 OK”)?
【问题讨论】:
标签: c++ networking boost boost-asio