From 7ace8bbb3c5062e5b582ced22e6a051e932b8ba5 Mon Sep 17 00:00:00 2001 From: Ayndpa Date: Wed, 19 Nov 2025 17:12:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BAMultiplexManager=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=87=BD=E6=95=B0=EF=BC=8C=E6=B7=BB=E5=8A=A0io=5Fcont?= =?UTF-8?q?ext=E3=80=81isHost=E5=92=8ClocalPort=E5=8F=82=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=9C=A8TCPServer=E4=B8=AD=E7=9B=B8=E5=BA=94=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- multiplex/multiplex_manager.cpp | 24 ++++++++++++++++++++++-- multiplex/multiplex_manager.h | 6 +++++- tcp/tcp_server.cpp | 3 ++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/multiplex/multiplex_manager.cpp b/multiplex/multiplex_manager.cpp index 8492ef1..065ff3a 100644 --- a/multiplex/multiplex_manager.cpp +++ b/multiplex/multiplex_manager.cpp @@ -2,8 +2,10 @@ #include #include -MultiplexManager::MultiplexManager(ISteamNetworkingSockets* steamInterface, HSteamNetConnection steamConn) - : steamInterface_(steamInterface), steamConn_(steamConn), nextId_(1) {} +MultiplexManager::MultiplexManager(ISteamNetworkingSockets* steamInterface, HSteamNetConnection steamConn, + boost::asio::io_context& io_context, bool& isHost, int& localPort) + : steamInterface_(steamInterface), steamConn_(steamConn), nextId_(1), + io_context_(io_context), isHost_(isHost), localPort_(localPort) {} MultiplexManager::~MultiplexManager() { // Close all sockets @@ -65,6 +67,24 @@ void MultiplexManager::handleTunnelPacket(const char* data, size_t len) { size_t dataLen = len - sizeof(uint32_t) * 2; const char* packetData = data + sizeof(uint32_t) * 2; auto socket = getClient(id); + if (!socket && isHost_ && localPort_ > 0) { + // 如果是主持且没有对应的 TCP Client,创建一个连接到本地端口 + std::cout << "Creating new TCP client for id " << id << " connecting to localhost:" << localPort_ << std::endl; + try { + auto newSocket = std::make_shared(io_context_); + tcp::resolver resolver(io_context_); + auto endpoints = resolver.resolve("127.0.0.1", std::to_string(localPort_)); + boost::asio::connect(*newSocket, endpoints); + + std::lock_guard lock(mapMutex_); + clientMap_[id] = newSocket; + socket = newSocket; + std::cout << "Successfully created TCP client for id " << id << std::endl; + } catch (const std::exception& e) { + std::cerr << "Failed to create TCP client for id " << id << ": " << e.what() << std::endl; + return; + } + } if (socket) { boost::asio::async_write(*socket, boost::asio::buffer(packetData, dataLen), [](const boost::system::error_code&, std::size_t) {}); } else { diff --git a/multiplex/multiplex_manager.h b/multiplex/multiplex_manager.h index d30889e..d38f496 100644 --- a/multiplex/multiplex_manager.h +++ b/multiplex/multiplex_manager.h @@ -13,7 +13,8 @@ using boost::asio::ip::tcp; class MultiplexManager { public: - MultiplexManager(ISteamNetworkingSockets* steamInterface, HSteamNetConnection steamConn); + MultiplexManager(ISteamNetworkingSockets* steamInterface, HSteamNetConnection steamConn, + boost::asio::io_context& io_context, bool& isHost, int& localPort); ~MultiplexManager(); uint32_t addClient(std::shared_ptr socket); @@ -30,4 +31,7 @@ private: std::unordered_map> clientMap_; std::mutex mapMutex_; uint32_t nextId_; + boost::asio::io_context& io_context_; + bool& isHost_; + int& localPort_; }; \ No newline at end of file diff --git a/tcp/tcp_server.cpp b/tcp/tcp_server.cpp index 77b78ce..744e951 100644 --- a/tcp/tcp_server.cpp +++ b/tcp/tcp_server.cpp @@ -15,7 +15,8 @@ bool TCPServer::start() { acceptor_.bind(endpoint); acceptor_.listen(); - multiplexManager_ = std::make_unique(manager_->getInterface(), manager_->getConnection()); + multiplexManager_ = std::make_unique(manager_->getInterface(), manager_->getConnection(), + io_context_, manager_->getIsHost(), *manager_->getLocalPort()); running_ = true; serverThread_ = std::thread([this]() {