使用异步 cpp boost 套接字时减少响应时间

问题描述 投票:0回答:1

我创建了一个异步野兽服务器,它从浏览器获取请求,打开第二个套接字,写入请求,获取响应并将其发送回浏览器。全部异步。因为“发送回浏览器”操作会等待读取处理程序完成才能触发

void
on_write(
    boost::system::error_code ec,
    std::size_t bytes_transferred)
{
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail2(ec, "write");
    std::cout << "===========on_write============" << std::endl;
    stopper("async_write" , 0);
    stopper("on_write" , 1);
    // Receive the HTTP response
    http::async_read(redirect_stream_, redirect_buffer_, redirect_res_,
        std::bind(
            &session2::on_read,
            shared_from_this(),
            std::placeholders::_1,
            std::placeholders::_2));
}

void
on_read(
    boost::system::error_code ec,
    std::size_t bytes_transferred)
{
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail2(ec, "read");
    std::cout << "===========on_read============" << std::endl;
    stopper("on_write" , 0);
    stopper("on_read" , 1);
    // Write the message to standard out
    std::cout << redirect_res_.base() << std::endl;
    http::async_write(stream_, redirect_res_,
                      std::bind(
                          &session2::start_shutdown,
                          shared_from_this(),
                          std::placeholders::_1,
                          std::placeholders::_2));
    // Gracefully close the stream

}

(根据我所做的检查)似乎需要很长时间才能触发“写入浏览器”操作(on_read函数) 有没有更好的方法来减少浏览器的响应时间?也许通过“read_some”方法?

c++ asynchronous boost-asio beast-websockets
1个回答
0
投票

很大程度上取决于目标。如果您确实希望透明地中继请求/响应而不进行任何修改,那么 read_some 将是一个更好的方法(但您不需要 Beast 的任何内容,只需要 Asio)。

使用 Beast,您也可以读取部分请求,假设您可能想要修改有关正在中继的消息的某些内容,例如,您可以使用

message_parser<...>
代替
message<>
并使用
http::read_header
和循环来读取
buffer_body

文档中有一个示例实现了类似的功能:HTTP 中继示例

您还可以搜索我的答案:https://stackoverflow.com/search?q=user%3A85371+beast+read_header

buffer_body
和或
request_parser
/
response_parser

除此之外,还有许多减少延迟的小方法(适当规划线程、执行器、分配器)。但对于类似的事情,您可能应该发布您的代码(到 CodeReview?)。

© www.soinside.com 2019 - 2024. All rights reserved.