修改红绿灯http server,使用 lambda 表达式

This commit is contained in:
Tian jianyong 2025-05-09 15:07:25 +08:00
parent 9414555aa6
commit 46c23cc1dd

View File

@ -5,12 +5,10 @@
#include <boost/asio/signal_set.hpp>
#include <boost/asio/strand.hpp>
#include <boost/asio/bind_executor.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/bind/bind.hpp>
#include <boost/bind/placeholders.hpp>
#include <iostream>
#include <vector>
#include <memory>
@ -110,17 +108,19 @@ namespace network {
system_(system_ref) {}
void run() {
net::dispatch(strand_, boost::bind(&TrafficLightSession::do_read, shared_from_this()));
net::dispatch(strand_, [self = shared_from_this()]() {
self->do_read();
});
}
private:
void do_read() {
req_ = {};
req_ = {}; // 清空请求对象以便重用
http::async_read(socket_, buffer_, req_,
net::bind_executor(strand_,
boost::bind(&TrafficLightSession::on_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
[self = shared_from_this()](beast::error_code ec, std::size_t bytes_transferred) {
self->on_read(ec, bytes_transferred);
}
));
}
@ -274,30 +274,30 @@ namespace network {
void do_accept() {
acceptor_.async_accept(
net::bind_executor(acceptor_.get_executor(),
boost::bind(&TrafficLightListener::on_accept, shared_from_this(),
boost::asio::placeholders::error,
boost::placeholders::_2)
[self = shared_from_this()](beast::error_code ec, tcp::socket socket) { // socket 按值传递
if (ec) {
if (ec == net::error::operation_aborted) {
return; // 服务器停止,不再接受
}
Logger::error("Listener Accept Error: ", ec.message());
// 对于其他错误,我们仍然尝试继续接受,除非 acceptor 关闭
} else {
Logger::info("Accepted connection from ", socket.remote_endpoint());
std::make_shared<TrafficLightSession>(
std::move(socket), // 从 lambda 的参数 socket 移动
self->doc_root_, // 访问 listener 的成员
self->ioc_, // 访问 listener 的成员
self->system_ // 访问 listener 的成员
)->run();
}
if (self->acceptor_.is_open()) {
self->do_accept(); // 继续接受下一个连接
}
}
)
);
}
void on_accept(beast::error_code ec, tcp::socket&& socket) {
if (ec) {
if (ec != net::error::operation_aborted)
Logger::error("Listener Accept Error: ", ec.message());
return;
} else {
// 移除连接数检查简化注释
Logger::info("Accepted connection from ", socket.remote_endpoint());
std::make_shared<TrafficLightSession>(
std::move(socket),
doc_root_,
ioc_,
system_
)->run();
}
do_accept();
}
};
//---------------- TrafficLightHttpServer Implementation -------------------