From 1991cc9a5d3d5cc957ba929d25b8258120ccfb96 Mon Sep 17 00:00:00 2001 From: Ayndpa Date: Wed, 19 Nov 2025 19:01:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BAMultiplexManager=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E6=AD=A5=E8=AF=BB=E5=8F=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E7=AE=A1=E7=90=86=E6=AF=8F=E4=B8=AA=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=9A=84=E8=AF=BB=E5=8F=96=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- net/multiplex_manager.cpp | 19 +++++++++++++++++++ net/multiplex_manager.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/net/multiplex_manager.cpp b/net/multiplex_manager.cpp index 267934e..b8c2206 100644 --- a/net/multiplex_manager.cpp +++ b/net/multiplex_manager.cpp @@ -21,6 +21,8 @@ std::string MultiplexManager::addClient(std::shared_ptr socket) { std::lock_guard lock(mapMutex_); std::string id = nanoid::generate(6); clientMap_[id] = socket; + readBuffers_[id].resize(1024); + startAsyncRead(id); return id; } @@ -31,6 +33,7 @@ void MultiplexManager::removeClient(const std::string& id) { it->second->close(); clientMap_.erase(it); } + readBuffers_.erase(id); } std::shared_ptr MultiplexManager::getClient(const std::string& id) { @@ -80,8 +83,10 @@ void MultiplexManager::handleTunnelPacket(const char* data, size_t len) { std::lock_guard lock(mapMutex_); clientMap_[id] = newSocket; + readBuffers_[id].resize(1024); socket = newSocket; std::cout << "Successfully created TCP client for id " << id << std::endl; + startAsyncRead(id); } catch (const std::exception& e) { std::cerr << "Failed to create TCP client for id " << id << ": " << e.what() << std::endl; return; @@ -99,4 +104,18 @@ void MultiplexManager::handleTunnelPacket(const char* data, size_t len) { } else { std::cerr << "Unknown packet type " << type << std::endl; } +} + +void MultiplexManager::startAsyncRead(const std::string& id) { + auto socket = getClient(id); + if (!socket || readBuffers_.find(id) == readBuffers_.end()) return; + socket->async_read_some(boost::asio::buffer(readBuffers_[id]), + [this, id](const boost::system::error_code& ec, std::size_t bytes_transferred) { + if (!ec && bytes_transferred > 0) { + sendTunnelPacket(id, readBuffers_[id].data(), bytes_transferred, 0); + startAsyncRead(id); + } else { + removeClient(id); + } + }); } \ No newline at end of file diff --git a/net/multiplex_manager.h b/net/multiplex_manager.h index 76976c5..dd4a5f4 100644 --- a/net/multiplex_manager.h +++ b/net/multiplex_manager.h @@ -34,4 +34,7 @@ private: boost::asio::io_context& io_context_; bool& isHost_; int& localPort_; + std::unordered_map> readBuffers_; + + void startAsyncRead(const std::string& id); }; \ No newline at end of file