From 04a8f15f051ce32bd5cd0079c6bede19c0733106 Mon Sep 17 00:00:00 2001 From: Hevake Date: Wed, 12 Nov 2025 17:51:28 +0800 Subject: [PATCH] =?UTF-8?q?opt(http):=E4=BC=98=E5=8C=96=E4=BA=86Http?= =?UTF-8?q?=E7=9A=84Session=E7=AE=A1=E7=90=86=EF=BC=9B=E5=9C=A8TcpServer?= =?UTF-8?q?=E4=B8=AD=E6=B7=BB=E5=8A=A0=E4=BA=86detachConnection()=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/http/server/server_imp.cpp | 30 +++++++----------------------- modules/http/server/server_imp.h | 2 -- modules/network/tcp_server.cpp | 11 +++++++++++ modules/network/tcp_server.h | 3 +++ 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/modules/http/server/server_imp.cpp b/modules/http/server/server_imp.cpp index 8db8a8f..cb5f28d 100644 --- a/modules/http/server/server_imp.cpp +++ b/modules/http/server/server_imp.cpp @@ -52,7 +52,6 @@ bool Server::Impl::initialize(const network::SockAddr &bind_addr, int listen_bac return false; tcp_server_.setConnectedCallback(bind(&Impl::onTcpConnected, this, _1)); - tcp_server_.setDisconnectedCallback(bind(&Impl::onTcpDisconnected, this, _1)); tcp_server_.setReceiveCallback(bind(&Impl::onTcpReceived, this, _1, _2), 0); tcp_server_.setSendCompleteCallback(bind(&Impl::onTcpSendCompleted, this, _1)); @@ -85,10 +84,6 @@ void Server::Impl::cleanup() req_handler_.clear(); tcp_server_.cleanup(); - for (auto conn : conns_) - delete conn; - conns_.clear(); - state_ = State::kNone; } } @@ -107,18 +102,12 @@ void Server::Impl::onTcpConnected(const TcpServer::ConnToken &ct) { RECORD_SCOPE(); auto conn = new Connection; - tcp_server_.setContext(ct, conn); - conns_.insert(conn); -} - -void Server::Impl::onTcpDisconnected(const TcpServer::ConnToken &ct) -{ - RECORD_SCOPE(); - Connection *conn = static_cast(tcp_server_.getContext(ct)); - TBOX_ASSERT(conn != nullptr); - - conns_.erase(conn); - delete conn; + tcp_server_.setContext(ct, conn, + [](void* ptr) { + auto conn = static_cast(ptr); + CHECK_DELETE_OBJ(conn); + } + ); } namespace { @@ -180,8 +169,6 @@ void Server::Impl::onTcpReceived(const TcpServer::ConnToken &ct, Buffer &buff) } else if (conn->req_parser.state() == RequestParser::State::kFail) { LogNotice("parse http from %s fail", tcp_server_.getClientAddress(ct).toString().c_str()); tcp_server_.disconnect(ct); - conns_.erase(conn); - delete conn; break; } else { @@ -200,11 +187,8 @@ void Server::Impl::onTcpSendCompleted(const TcpServer::ConnToken &ct) TBOX_ASSERT(conn != nullptr); //! 如果最后一个已完成发送,则断开连接 - if (conn->res_index > conn->close_index) { + if (conn->res_index > conn->close_index) tcp_server_.disconnect(ct); - conns_.erase(conn); - delete conn; - } } /** diff --git a/modules/http/server/server_imp.h b/modules/http/server/server_imp.h index 878813a..df95844 100644 --- a/modules/http/server/server_imp.h +++ b/modules/http/server/server_imp.h @@ -63,7 +63,6 @@ class Server::Impl { private: void onTcpConnected(const TcpServer::ConnToken &ct); - void onTcpDisconnected(const TcpServer::ConnToken &ct); void onTcpReceived(const TcpServer::ConnToken &ct, Buffer &buff); void onTcpSendCompleted(const TcpServer::ConnToken &ct); @@ -85,7 +84,6 @@ class Server::Impl { TcpServer tcp_server_; vector req_handler_; - set conns_; //! 仅用于保存Connection指针,用于释放 State state_ = State::kNone; bool context_log_enable_ = false; diff --git a/modules/network/tcp_server.cpp b/modules/network/tcp_server.cpp index 09aeb28..89a017e 100644 --- a/modules/network/tcp_server.cpp +++ b/modules/network/tcp_server.cpp @@ -225,6 +225,17 @@ TcpServer::State TcpServer::state() const return d_->state; } +TcpConnection* TcpServer::detachConnection(const ConnToken &client) +{ + auto conn = d_->conns.free(client); + if (conn != nullptr) { + conn->setReceiveCallback(nullptr, 0); + conn->setDisconnectedCallback(nullptr); + conn->setSendCompleteCallback(nullptr); + } + return conn; +} + void TcpServer::onTcpConnected(TcpConnection *new_conn) { RECORD_SCOPE(); diff --git a/modules/network/tcp_server.h b/modules/network/tcp_server.h index 56ea858..8a7c121 100644 --- a/modules/network/tcp_server.h +++ b/modules/network/tcp_server.h @@ -94,6 +94,9 @@ class TcpServer { State state() const; + //! 分离指定的连接,用于实现WebSocket + TcpConnection* detachConnection(const ConnToken &client); + protected: void onTcpConnected(TcpConnection *new_conn); void onTcpDisconnected(const ConnToken &client); -- Gitee