gpt4 book ai didi

c++ - boost ASIO async_read_some

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:53 25 4
gpt4 key购买 nike

我在实现一个简单的 TCP 服务器时遇到了困难。以下代码摘自boost::asio examples ,准确地说是“Http 服务器 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 中总是有一个响应,所以我的网络浏览器一直在等待它并且不关闭连接,但是我的服务器如何知道请求已经结束(并且可能关闭它或回复一些“200 OK”)?

最佳答案

假设浏览器向您发送 1360 字节的数据,您说 asio 将一些数据读入您的缓冲区,您说它只有 32 字节。那么你第一次调用它时,你的处理程序将以 32 字节的数据开头被调用。在这里如果你评论 (1) 然后浏览器尝试发送它的其余数据(实际上浏览器已经发送它并且它在操作系统缓冲区中等待你从那里偷看它)并且你可能被阻止在 io_service 后面: :run 创造奇迹!!

如果你在循环开始时取消注释 (1),你会读取第一个 block ,然后是下一个 block ,然后......直到浏览器发送的数据完成,但在那之后当你说 asio 要读取更多数据,它将等待更多数据,这些数据永远不会来自浏览器(因为浏览器已经发送了它的信息并正在等待您的回答)并且当您取消来自浏览器的请求时,它将关闭其套接字并那么你的处理程序将被调用,并显示一个错误,说我无法读取更多数据,因为连接已关闭。!!

但你应该在这里做的是让它工作:你应该学习 HTTP 格式,从而知道你的浏览器发送给你的数据是什么,并为它提供一个好的答案,然后你的与客户的沟通将继续进行。在这种情况下,缓冲区的末尾是 \r\n\r\n 并且当您看到它时,您不应该再读取任何数据,您应该处理到现在为止所读取的内容,然后将响应发送到浏览器。

关于c++ - boost ASIO async_read_some,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com