diff --git a/modules/http/server/server_imp.cpp b/modules/http/server/server_imp.cpp index 8db8a8f59b7f5657f54fd3f7f88b5b5830a801a8..cb5f28d5206ce9befcda1f731a1a87076622e23a 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 878813aa412cc74b11a3b3de6a16ccc5fad7f406..df958441c7fb0d63c3a807151c0ff25902fd1b7b 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 09aeb28d78758f0ca3a55012a3035d20f48501aa..89a017e6004528381f7857fb6ac53de8ee65e763 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 56ea85856718ee4b3c83a92167d895dbcae3c27e..8a7c121646a58087ad6658cd5fe2ebe58e85ee54 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);