重构MultiplexManager和TCPServer,优化客户端管理和连接逻辑,添加异步读取和错误处理

This commit is contained in:
Ayndpa
2025-11-19 20:25:25 +08:00
parent 1991cc9a5d
commit cd7a035ba8
6 changed files with 116 additions and 56 deletions

View File

@@ -17,14 +17,30 @@ void SteamMessageHandler::start() {
if (running_) return;
running_ = true;
thread_ = std::thread([this]() { run(); });
// Start io_context in a separate thread
io_thread_ = std::thread([this]() {
auto work = boost::asio::make_work_guard(io_context_);
io_context_.run();
});
}
void SteamMessageHandler::stop() {
if (!running_) return;
running_ = false;
io_context_.stop();
if (thread_.joinable()) {
thread_.join();
}
if (io_thread_.joinable()) {
io_thread_.join();
}
}
std::shared_ptr<MultiplexManager> SteamMessageHandler::getMultiplexManager(HSteamNetConnection conn) {
if (multiplexManagers_.find(conn) == multiplexManagers_.end()) {
multiplexManagers_[conn] = std::make_shared<MultiplexManager>(m_pInterface_, conn, io_context_, g_isHost_, localPort_);
}
return multiplexManagers_[conn];
}
void SteamMessageHandler::run() {
@@ -50,7 +66,6 @@ void SteamMessageHandler::pollMessages() {
ISteamNetworkingMessage* pIncomingMsgs[10];
int numMsgs = m_pInterface_->ReceiveMessagesOnConnection(conn, pIncomingMsgs, 10);
for (int i = 0; i < numMsgs; ++i) {
std::cout << "Received message on connection " << conn << std::endl;
ISteamNetworkingMessage* pIncomingMsg = pIncomingMsgs[i];
const char* data = (const char*)pIncomingMsg->m_pData;
size_t size = pIncomingMsg->m_cbSize;

View File

@@ -19,6 +19,8 @@ public:
void start();
void stop();
std::shared_ptr<MultiplexManager> getMultiplexManager(HSteamNetConnection conn);
private:
void run();
void pollMessages();
@@ -33,6 +35,7 @@ private:
std::map<HSteamNetConnection, std::shared_ptr<MultiplexManager>> multiplexManagers_;
std::thread thread_;
std::thread io_thread_;
bool running_;
};

View File

@@ -58,6 +58,7 @@ public:
// Message handler
void startMessageHandler();
void stopMessageHandler();
SteamMessageHandler* getMessageHandler() { return messageHandler_; }
// Update user info (ping, relay status)
void update();