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:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
Reference in New Issue
Block a user