Refactor Steam Networking Components

- Removed SteamMessageHandler class and its implementation files.
- Integrated control packet handling directly into the SteamMessageHandler.
- Updated TCPClient and TCPServer classes to improve connection management and error handling.
- Added SteamNetworkingManager class to manage Steam networking, including lobby creation and connection handling.
- Implemented callbacks for Steam Friends and Matchmaking to handle lobby events.
- Enhanced message forwarding logic between TCP clients and Steam connections.
- Introduced control packet handling for ping responses.
- Improved thread safety with mutexes for shared resources.
This commit is contained in:
Ayndpa
2025-11-18 21:03:01 +08:00
parent 676d39d6a2
commit af181bb133
10 changed files with 547 additions and 281 deletions

View File

@@ -28,16 +28,21 @@ bool TCPClient::connect() {
void TCPClient::disconnect() {
if (disconnected_) return;
disconnected_ = true;
if (disconnectCallback_) {
disconnectCallback_();
}
connected_ = false;
io_context_.stop();
if (clientThread_.joinable()) {
clientThread_.join();
if (clientThread_.get_id() == std::this_thread::get_id()) {
clientThread_.detach();
} else {
clientThread_.join();
}
}
if (socket_->is_open()) {
socket_->close();
try {
if (socket_->is_open()) {
socket_->close();
}
} catch (const std::exception& e) {
std::cerr << "Error closing socket: " << e.what() << std::endl;
}
}
@@ -90,6 +95,9 @@ void TCPClient::handle_read(const boost::system::error_code& error, std::size_t
} else {
std::cerr << "Read failed: " << error.message() << std::endl;
}
if (disconnectCallback_) {
disconnectCallback_();
}
disconnect();
}
}

View File

@@ -1,8 +1,9 @@
#include "tcp_server.h"
#include "../steamnet/steam_networking_manager.h"
#include <iostream>
#include <algorithm>
TCPServer::TCPServer(int port) : port_(port), running_(false), acceptor_(io_context_), work_(boost::asio::make_work_guard(io_context_)), hasAcceptedConnection_(false) {}
TCPServer::TCPServer(int port, SteamNetworkingManager* manager) : port_(port), running_(false), acceptor_(io_context_), work_(boost::asio::make_work_guard(io_context_)), hasAcceptedConnection_(false), manager_(manager), forwarding_(false) {}
TCPServer::~TCPServer() { stop(); }
@@ -80,18 +81,21 @@ void TCPServer::start_read(std::shared_ptr<tcp::socket> socket) {
auto buffer = std::make_shared<std::vector<char>>(1024);
socket->async_read_some(boost::asio::buffer(*buffer), [this, socket, buffer](const boost::system::error_code& error, std::size_t bytes_transferred) {
if (!error) {
// std::cout << "Received " << bytes_transferred << " bytes from client" << std::endl;
if (!forwarding) {
forwarding = true;
if (g_isConnected) {
m_pInterface->SendMessageToConnection(g_hConnection, buffer->data(), bytes_transferred, k_nSteamNetworkingSend_Reliable, nullptr);
std::cout << "Received " << bytes_transferred << " bytes from TCP client" << std::endl;
if (!forwarding_) {
forwarding_ = true;
if (manager_->isConnected()) {
std::cout << "Forwarding TCP message to Steam connection" << std::endl;
manager_->getInterface()->SendMessageToConnection(manager_->getConnection(), buffer->data(), bytes_transferred, k_nSteamNetworkingSend_Reliable, nullptr);
} else {
std::cout << "Not connected to Steam, skipping forward" << std::endl;
}
forwarding = false;
forwarding_ = false;
}
sendToAll(buffer->data(), bytes_transferred, socket);
start_read(socket);
} else {
std::cout << "Client disconnected" << std::endl;
std::cout << "TCP client disconnected or error: " << error.message() << std::endl;
// Remove client
std::lock_guard<std::mutex> lock(clientsMutex_);
clients_.erase(std::remove(clients_.begin(), clients_.end(), socket), clients_.end());

View File

@@ -10,18 +10,14 @@
#include <isteamnetworkingutils.h>
#include <steamnetworkingtypes.h>
using boost::asio::ip::tcp;
class SteamNetworkingManager;
// Extern declarations for global variables used in TCPServer
extern HSteamNetConnection g_hConnection;
extern bool g_isConnected;
extern ISteamNetworkingSockets* m_pInterface;
extern bool forwarding;
using boost::asio::ip::tcp;
// TCP Server class
class TCPServer {
public:
TCPServer(int port);
TCPServer(int port, SteamNetworkingManager* manager);
~TCPServer();
bool start();
@@ -43,4 +39,6 @@ private:
std::mutex clientsMutex_;
std::thread serverThread_;
bool hasAcceptedConnection_;
SteamNetworkingManager* manager_;
bool forwarding_;
};