提升ASIO async_read_some

Que*_*ueg 5 c++ networking boost boost-asio

我在实现一个简单的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());
            }
        }
Run Code Online (Sandbox Code Playgroud)

在原始代码中,buffer_它足以保留整个请求.这不是我需要的.我把大小改为32bytes.

服务器在localhost的端口80上编译和监听,所以我尝试通过我的Web浏览器连接到它.

现在,如果语句(1)被注释掉,那么只读取请求的前32个字节并且连接挂起.Web浏览器一直在等待响应,服务器确实......我不知道是什么.

如果(1)被取消注释,那么整个请求被读取(并被附加到data_),但它永远不会停止 - 我必须在浏览器中取消请求,然后才else { }运行该部分 - 我在stdout上看到了我的请求.

问题1:我应该如何处理大量请求?
问题2:我应该如何缓存请求(目前我将缓冲区附加到字符串)?
问题3:如何判断请求已结束?在HTTP中始终存在响应,因此我的Web浏览器一直在等待它并且没有关闭连接,但是我的服务器如何知道请求已经结束(并且可能关闭它或回复一些"200 OK")?

Big*_*oss 9

假设浏览器发送了1360个字节的数据,你说asio要将一些数据读入缓冲区,你说它只有32个字节.然后第一次调用它时,将使用32字节的数据开始调用您的处理程序.在这里,如果你评论(1)然后浏览器尝试发送其余的数据(实际上浏览器已经发送它,它在OS缓冲区,等待你从那里偷看它),你可能被阻止了io_service::run一些奇迹!

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

但是你应该做的就是:你应该学习HTTP格式,从而知道你的浏览器发送给你的数据是什么,并为它提供一个好的答案,然后你将与客户进行沟通.在这种情况下,缓冲区的结束是\r\n\r\n,当你看到它时你不应该再读取任何数据,你应该处理你读到的内容,然后向浏览器发送响应.