使用异步 cpp 升压套接字时减少响应时间
reduce response time while using async cpp boost socket
我创建了一个异步野兽服务器,它从浏览器获取请求,打开第二个套接字,写入请求,获取响应并将其发送回浏览器。所有异步。因为“发送回浏览器”操作等待读取处理程序完成触发
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”方法?
很大程度上取决于目标。如果你真的希望透明地中继 request/response 而不做任何修改,那么 read_some 将是一个更好的方法(但你不需要 Beast 的任何东西,只需要 Asio)。
使用 Beast,您也可以读取部分请求,假设您可能想要修改有关正在中继的消息的某些内容,例如,您可以使用 message_parser<...>
而不是 message<>
并使用 http::read_header
和一个循环来读取 buffer_body
.
文档中有一个示例实现了这样的事情:HTTP Relay example。
You can also search my answers: https://whosebug.com/search?q=user%3A85371+beast+read_header or for buffer_body
and or request_parser
/response_parser
除此之外,还有许多减少延迟的小方法(适当规划线程、执行器、分配器)。但是对于类似的事情,您可能应该 post 您的代码(到 CodeReview?)。
我创建了一个异步野兽服务器,它从浏览器获取请求,打开第二个套接字,写入请求,获取响应并将其发送回浏览器。所有异步。因为“发送回浏览器”操作等待读取处理程序完成触发
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”方法?
很大程度上取决于目标。如果你真的希望透明地中继 request/response 而不做任何修改,那么 read_some 将是一个更好的方法(但你不需要 Beast 的任何东西,只需要 Asio)。
使用 Beast,您也可以读取部分请求,假设您可能想要修改有关正在中继的消息的某些内容,例如,您可以使用 message_parser<...>
而不是 message<>
并使用 http::read_header
和一个循环来读取 buffer_body
.
文档中有一个示例实现了这样的事情:HTTP Relay example。
You can also search my answers: https://whosebug.com/search?q=user%3A85371+beast+read_header or for
buffer_body
and orrequest_parser
/response_parser
除此之外,还有许多减少延迟的小方法(适当规划线程、执行器、分配器)。但是对于类似的事情,您可能应该 post 您的代码(到 CodeReview?)。