Make gameserver and client interfaces share the same socket pool.

Some games depend on this behavior.
This commit is contained in:
Mr_Goldberg 2022-01-26 12:03:08 -05:00
parent eda9abd2aa
commit 5533a9d5b0
No known key found for this signature in database
GPG key ID: 8597D87419DEF278
2 changed files with 103 additions and 71 deletions

View file

@ -83,7 +83,7 @@ Steam_Client::Steam_Client()
steam_inventory = new Steam_Inventory(settings_client, callback_results_client, callbacks_client, run_every_runcb, local_storage); steam_inventory = new Steam_Inventory(settings_client, callback_results_client, callbacks_client, run_every_runcb, local_storage);
steam_video = new Steam_Video(); steam_video = new Steam_Video();
steam_parental = new Steam_Parental(); steam_parental = new Steam_Parental();
steam_networking_sockets = new Steam_Networking_Sockets(settings_client, network, callback_results_client, callbacks_client, run_every_runcb); steam_networking_sockets = new Steam_Networking_Sockets(settings_client, network, callback_results_client, callbacks_client, run_every_runcb, NULL);
steam_networking_sockets_serialized = new Steam_Networking_Sockets_Serialized(settings_client, network, callback_results_client, callbacks_client, run_every_runcb); steam_networking_sockets_serialized = new Steam_Networking_Sockets_Serialized(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
steam_networking_messages = new Steam_Networking_Messages(settings_client, network, callback_results_client, callbacks_client, run_every_runcb); steam_networking_messages = new Steam_Networking_Messages(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
steam_game_coordinator = new Steam_Game_Coordinator(settings_client, network, callback_results_client, callbacks_client, run_every_runcb); steam_game_coordinator = new Steam_Game_Coordinator(settings_client, network, callback_results_client, callbacks_client, run_every_runcb);
@ -103,7 +103,7 @@ Steam_Client::Steam_Client()
steam_gameserver_inventory = new Steam_Inventory(settings_server, callback_results_server, callbacks_server, run_every_runcb, local_storage); steam_gameserver_inventory = new Steam_Inventory(settings_server, callback_results_server, callbacks_server, run_every_runcb, local_storage);
steam_gameserver_ugc = new Steam_UGC(settings_server, callback_results_server, callbacks_server); steam_gameserver_ugc = new Steam_UGC(settings_server, callback_results_server, callbacks_server);
steam_gameserver_apps = new Steam_Apps(settings_server, callback_results_server); steam_gameserver_apps = new Steam_Apps(settings_server, callback_results_server);
steam_gameserver_networking_sockets = new Steam_Networking_Sockets(settings_server, network, callback_results_server, callbacks_server, run_every_runcb); steam_gameserver_networking_sockets = new Steam_Networking_Sockets(settings_server, network, callback_results_server, callbacks_server, run_every_runcb, steam_networking_sockets->get_shared_between_client_server());
steam_gameserver_networking_sockets_serialized = new Steam_Networking_Sockets_Serialized(settings_server, network, callback_results_server, callbacks_server, run_every_runcb); steam_gameserver_networking_sockets_serialized = new Steam_Networking_Sockets_Serialized(settings_server, network, callback_results_server, callbacks_server, run_every_runcb);
steam_gameserver_networking_messages = new Steam_Networking_Messages(settings_server, network, callback_results_server, callbacks_server, run_every_runcb); steam_gameserver_networking_messages = new Steam_Networking_Messages(settings_server, network, callback_results_server, callbacks_server, run_every_runcb);
steam_gameserver_game_coordinator = new Steam_Game_Coordinator(settings_server, network, callback_results_server, callbacks_server, run_every_runcb); steam_gameserver_game_coordinator = new Steam_Game_Coordinator(settings_server, network, callback_results_server, callbacks_server, run_every_runcb);

View file

@ -22,6 +22,8 @@ struct Listen_Socket {
int virtual_port; int virtual_port;
int real_port; int real_port;
CSteamID created_by;
}; };
enum connect_socket_status { enum connect_socket_status {
@ -49,6 +51,14 @@ struct Connect_Socket {
HSteamNetPollGroup poll_group; HSteamNetPollGroup poll_group;
unsigned long long packet_receive_counter; unsigned long long packet_receive_counter;
CSteamID created_by;
};
struct shared_between_client_server {
std::vector<struct Listen_Socket> listen_sockets;
std::map<HSteamNetConnection, struct Connect_Socket> connect_sockets;
std::map<HSteamNetPollGroup, std::list<HSteamNetConnection>> poll_groups;
unsigned used;
}; };
class Steam_Networking_Sockets : class Steam_Networking_Sockets :
@ -67,9 +77,7 @@ public ISteamNetworkingSockets
class SteamCallBacks *callbacks; class SteamCallBacks *callbacks;
class RunEveryRunCB *run_every_runcb; class RunEveryRunCB *run_every_runcb;
std::vector<struct Listen_Socket> listen_sockets; struct shared_between_client_server *s;
std::map<HSteamNetConnection, struct Connect_Socket> connect_sockets;
std::map<HSteamNetPollGroup, std::list<HSteamNetConnection>> poll_groups;
std::chrono::steady_clock::time_point created; std::chrono::steady_clock::time_point created;
static const int SNS_DISABLED_PORT = -1; static const int SNS_DISABLED_PORT = -1;
@ -91,7 +99,7 @@ static void steam_run_every_runcb(void *object)
steam_networkingsockets->RunCallbacks(); steam_networkingsockets->RunCallbacks();
} }
Steam_Networking_Sockets(class Settings *settings, class Networking *network, class SteamCallResults *callback_results, class SteamCallBacks *callbacks, class RunEveryRunCB *run_every_runcb) Steam_Networking_Sockets(class Settings *settings, class Networking *network, class SteamCallResults *callback_results, class SteamCallBacks *callbacks, class RunEveryRunCB *run_every_runcb, shared_between_client_server *sbcs)
{ {
this->settings = settings; this->settings = settings;
this->network = network; this->network = network;
@ -103,6 +111,14 @@ Steam_Networking_Sockets(class Settings *settings, class Networking *network, cl
this->callback_results = callback_results; this->callback_results = callback_results;
this->callbacks = callbacks; this->callbacks = callbacks;
if (!sbcs) {
this->s = new shared_between_client_server();
this->s->used = 0;
} else {
this->s = sbcs;
this->s->used += 1;
}
this->created = std::chrono::steady_clock::now(); this->created = std::chrono::steady_clock::now();
} }
@ -110,6 +126,11 @@ Steam_Networking_Sockets(class Settings *settings, class Networking *network, cl
{ {
//TODO rm network callbacks //TODO rm network callbacks
this->run_every_runcb->remove(&Steam_Networking_Sockets::steam_run_every_runcb, this); this->run_every_runcb->remove(&Steam_Networking_Sockets::steam_run_every_runcb, this);
if (this->s->used) {
this->s->used -= 1;
} else {
delete this->s;
}
} }
static unsigned long get_socket_id() static unsigned long get_socket_id()
@ -119,38 +140,45 @@ static unsigned long get_socket_id()
return socket_id; return socket_id;
} }
shared_between_client_server *get_shared_between_client_server()
{
return s;
}
HSteamListenSocket new_listen_socket(int nSteamConnectVirtualPort, int real_port) HSteamListenSocket new_listen_socket(int nSteamConnectVirtualPort, int real_port)
{ {
HSteamListenSocket socket_id = get_socket_id(); HSteamListenSocket socket_id = get_socket_id();
if (socket_id == k_HSteamListenSocket_Invalid) ++socket_id; if (socket_id == k_HSteamListenSocket_Invalid) ++socket_id;
CSteamID steam_id = settings->get_local_steam_id();
auto conn = std::find_if(listen_sockets.begin(), listen_sockets.end(), [&nSteamConnectVirtualPort](struct Listen_Socket const& conn) { return conn.virtual_port == nSteamConnectVirtualPort;}); auto conn = std::find_if(s->listen_sockets.begin(), s->listen_sockets.end(), [&nSteamConnectVirtualPort,&steam_id](struct Listen_Socket const& conn) { return conn.virtual_port == nSteamConnectVirtualPort && conn.created_by == steam_id;});
if (conn != listen_sockets.end()) return k_HSteamListenSocket_Invalid; if (conn != s->listen_sockets.end()) return k_HSteamListenSocket_Invalid;
struct Listen_Socket listen_socket; struct Listen_Socket listen_socket;
listen_socket.socket_id = socket_id; listen_socket.socket_id = socket_id;
listen_socket.virtual_port = nSteamConnectVirtualPort; listen_socket.virtual_port = nSteamConnectVirtualPort;
listen_socket.real_port = real_port; listen_socket.real_port = real_port;
listen_sockets.push_back(listen_socket); listen_socket.created_by = steam_id;
s->listen_sockets.push_back(listen_socket);
return socket_id; return socket_id;
} }
struct Listen_Socket *get_connection_socket(HSteamListenSocket id) struct Listen_Socket *get_connection_socket(HSteamListenSocket id)
{ {
auto conn = std::find_if(listen_sockets.begin(), listen_sockets.end(), [&id](struct Listen_Socket const& conn) { return conn.socket_id == id;}); auto conn = std::find_if(s->listen_sockets.begin(), s->listen_sockets.end(), [&id](struct Listen_Socket const& conn) { return conn.socket_id == id;});
if (conn == listen_sockets.end()) return NULL; if (conn == s->listen_sockets.end()) return NULL;
return &(*conn); return &(*conn);
} }
bool send_packet_new_connection(HSteamNetConnection m_hConn) bool send_packet_new_connection(HSteamNetConnection m_hConn)
{ {
auto connect_socket = connect_sockets.find(m_hConn); auto connect_socket = s->connect_sockets.find(m_hConn);
if (connect_socket == connect_sockets.end()) return false; if (connect_socket == s->connect_sockets.end()) return false;
//TODO: right now this only supports connecting with steam id, might need to make ip/port connections work in the future when I find a game that uses them. //TODO: right now this only supports connecting with steam id, might need to make ip/port connections work in the future when I find a game that uses them.
Common_Message msg; Common_Message msg;
msg.set_source_id(settings->get_local_steam_id().ConvertToUint64()); msg.set_source_id(connect_socket->second.created_by.ConvertToUint64());
msg.set_allocated_networking_sockets(new Networking_Sockets); msg.set_allocated_networking_sockets(new Networking_Sockets);
if (connect_socket->second.status == CONNECT_SOCKET_CONNECTING) { if (connect_socket->second.status == CONNECT_SOCKET_CONNECTING) {
msg.mutable_networking_sockets()->set_type(Networking_Sockets::CONNECTION_REQUEST); msg.mutable_networking_sockets()->set_type(Networking_Sockets::CONNECTION_REQUEST);
@ -188,11 +216,12 @@ HSteamNetConnection new_connect_socket(SteamNetworkingIdentity remote_identity,
socket.status = status; socket.status = status;
socket.user_data = -1; socket.user_data = -1;
socket.poll_group = k_HSteamNetPollGroup_Invalid; socket.poll_group = k_HSteamNetPollGroup_Invalid;
socket.created_by = settings->get_local_steam_id();
HSteamNetConnection socket_id = get_socket_id(); HSteamNetConnection socket_id = get_socket_id();
if (socket_id == k_HSteamNetConnection_Invalid) ++socket_id; if (socket_id == k_HSteamNetConnection_Invalid) ++socket_id;
if (connect_sockets.insert(std::make_pair(socket_id, socket)).second == false) { if (s->connect_sockets.insert(std::make_pair(socket_id, socket)).second == false) {
return k_HSteamNetConnection_Invalid; return k_HSteamNetConnection_Invalid;
} }
@ -233,8 +262,8 @@ void set_steamnetconnectioninfo(std::map<HSteamNetConnection, Connect_Socket>::i
void launch_callback(HSteamNetConnection m_hConn, enum connect_socket_status old_status) void launch_callback(HSteamNetConnection m_hConn, enum connect_socket_status old_status)
{ {
auto connect_socket = connect_sockets.find(m_hConn); auto connect_socket = s->connect_sockets.find(m_hConn);
if (connect_socket == connect_sockets.end()) return; if (connect_socket == s->connect_sockets.end()) return;
struct SteamNetConnectionStatusChangedCallback_t data = {}; struct SteamNetConnectionStatusChangedCallback_t data = {};
data.m_hConn = connect_socket->first; data.m_hConn = connect_socket->first;
@ -492,8 +521,8 @@ EResult AcceptConnection( HSteamNetConnection hConn )
PRINT_DEBUG("Steam_Networking_Sockets::AcceptConnection %u\n", hConn); PRINT_DEBUG("Steam_Networking_Sockets::AcceptConnection %u\n", hConn);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) return k_EResultInvalidParam; if (connect_socket == s->connect_sockets.end()) return k_EResultInvalidParam;
if (connect_socket->second.status != CONNECT_SOCKET_NOT_ACCEPTED) return k_EResultInvalidState; if (connect_socket->second.status != CONNECT_SOCKET_NOT_ACCEPTED) return k_EResultInvalidState;
connect_socket->second.status = CONNECT_SOCKET_CONNECTED; connect_socket->second.status = CONNECT_SOCKET_CONNECTED;
send_packet_new_connection(connect_socket->first); send_packet_new_connection(connect_socket->first);
@ -529,13 +558,13 @@ bool CloseConnection( HSteamNetConnection hPeer, int nReason, const char *pszDeb
PRINT_DEBUG("Steam_Networking_Sockets::CloseConnection %u\n", hPeer); PRINT_DEBUG("Steam_Networking_Sockets::CloseConnection %u\n", hPeer);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hPeer); auto connect_socket = s->connect_sockets.find(hPeer);
if (connect_socket == connect_sockets.end()) return false; if (connect_socket == s->connect_sockets.end()) return false;
if (connect_socket->second.status != CONNECT_SOCKET_CLOSED && connect_socket->second.status != CONNECT_SOCKET_TIMEDOUT) { if (connect_socket->second.status != CONNECT_SOCKET_CLOSED && connect_socket->second.status != CONNECT_SOCKET_TIMEDOUT) {
//TODO send/nReason and pszDebug //TODO send/nReason and pszDebug
Common_Message msg; Common_Message msg;
msg.set_source_id(settings->get_local_steam_id().ConvertToUint64()); msg.set_source_id(connect_socket->second.created_by.ConvertToUint64());
msg.set_dest_id(connect_socket->second.remote_identity.GetSteamID64()); msg.set_dest_id(connect_socket->second.remote_identity.GetSteamID64());
msg.set_allocated_networking_sockets(new Networking_Sockets); msg.set_allocated_networking_sockets(new Networking_Sockets);
msg.mutable_networking_sockets()->set_type(Networking_Sockets::CONNECTION_END); msg.mutable_networking_sockets()->set_type(Networking_Sockets::CONNECTION_END);
@ -546,7 +575,7 @@ bool CloseConnection( HSteamNetConnection hPeer, int nReason, const char *pszDeb
network->sendTo(&msg, true); network->sendTo(&msg, true);
} }
connect_sockets.erase(connect_socket); s->connect_sockets.erase(connect_socket);
return true; return true;
} }
@ -573,13 +602,13 @@ bool CloseListenSocket( HSteamListenSocket hSocket )
PRINT_DEBUG("Steam_Networking_Sockets::CloseListenSocket\n"); PRINT_DEBUG("Steam_Networking_Sockets::CloseListenSocket\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto conn = std::find_if(listen_sockets.begin(), listen_sockets.end(), [&hSocket](struct Listen_Socket const& conn) { return conn.socket_id == hSocket;}); auto conn = std::find_if(s->listen_sockets.begin(), s->listen_sockets.end(), [&hSocket](struct Listen_Socket const& conn) { return conn.socket_id == hSocket;});
if (conn == listen_sockets.end()) return false; if (conn == s->listen_sockets.end()) return false;
std::queue<HSteamNetConnection> to_close; std::queue<HSteamNetConnection> to_close;
auto socket_conn = std::begin(connect_sockets); auto socket_conn = std::begin(s->connect_sockets);
while (socket_conn != std::end(connect_sockets)) { while (socket_conn != std::end(s->connect_sockets)) {
if (socket_conn->second.listen_socket_id == hSocket) { if (socket_conn->second.listen_socket_id == hSocket) {
to_close.push(socket_conn->first); to_close.push(socket_conn->first);
} }
@ -592,7 +621,7 @@ bool CloseListenSocket( HSteamListenSocket hSocket )
to_close.pop(); to_close.pop();
} }
listen_sockets.erase(conn); s->listen_sockets.erase(conn);
return true; return true;
} }
@ -601,8 +630,8 @@ bool SetConnectionUserData( HSteamNetConnection hPeer, int64 nUserData )
{ {
PRINT_DEBUG("Steam_Networking_Sockets::SetConnectionUserData\n"); PRINT_DEBUG("Steam_Networking_Sockets::SetConnectionUserData\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hPeer); auto connect_socket = s->connect_sockets.find(hPeer);
if (connect_socket == connect_sockets.end()) return false; if (connect_socket == s->connect_sockets.end()) return false;
connect_socket->second.user_data = nUserData; connect_socket->second.user_data = nUserData;
return true; return true;
} }
@ -614,8 +643,8 @@ int64 GetConnectionUserData( HSteamNetConnection hPeer )
{ {
PRINT_DEBUG("Steam_Networking_Sockets::GetConnectionUserData\n"); PRINT_DEBUG("Steam_Networking_Sockets::GetConnectionUserData\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hPeer); auto connect_socket = s->connect_sockets.find(hPeer);
if (connect_socket == connect_sockets.end()) return -1; if (connect_socket == s->connect_sockets.end()) return -1;
return connect_socket->second.user_data; return connect_socket->second.user_data;
} }
@ -707,14 +736,14 @@ EResult SendMessageToConnection( HSteamNetConnection hConn, const void *pData, u
PRINT_DEBUG("Steam_Networking_Sockets::SendMessageToConnection %u, len %u, flags %i\n", hConn, cbData, nSendFlags); PRINT_DEBUG("Steam_Networking_Sockets::SendMessageToConnection %u, len %u, flags %i\n", hConn, cbData, nSendFlags);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) return k_EResultInvalidParam; if (connect_socket == s->connect_sockets.end()) return k_EResultInvalidParam;
if (connect_socket->second.status == CONNECT_SOCKET_CLOSED) return k_EResultNoConnection; if (connect_socket->second.status == CONNECT_SOCKET_CLOSED) return k_EResultNoConnection;
if (connect_socket->second.status == CONNECT_SOCKET_TIMEDOUT) return k_EResultNoConnection; if (connect_socket->second.status == CONNECT_SOCKET_TIMEDOUT) return k_EResultNoConnection;
if (connect_socket->second.status != CONNECT_SOCKET_CONNECTED) return k_EResultInvalidState; if (connect_socket->second.status != CONNECT_SOCKET_CONNECTED) return k_EResultInvalidState;
Common_Message msg; Common_Message msg;
msg.set_source_id(settings->get_local_steam_id().ConvertToUint64()); msg.set_source_id(connect_socket->second.created_by.ConvertToUint64());
msg.set_dest_id(connect_socket->second.remote_identity.GetSteamID64()); msg.set_dest_id(connect_socket->second.remote_identity.GetSteamID64());
msg.set_allocated_networking_sockets(new Networking_Sockets); msg.set_allocated_networking_sockets(new Networking_Sockets);
msg.mutable_networking_sockets()->set_type(Networking_Sockets::DATA); msg.mutable_networking_sockets()->set_type(Networking_Sockets::DATA);
@ -800,8 +829,8 @@ static void delete_steam_message(SteamNetworkingMessage_t *pMsg)
SteamNetworkingMessage_t *get_steam_message_connection(HSteamNetConnection hConn) SteamNetworkingMessage_t *get_steam_message_connection(HSteamNetConnection hConn)
{ {
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) return NULL; if (connect_socket == s->connect_sockets.end()) return NULL;
if (connect_socket->second.data.empty()) return NULL; if (connect_socket->second.data.empty()) return NULL;
SteamNetworkingMessage_t *pMsg = new SteamNetworkingMessage_t(); SteamNetworkingMessage_t *pMsg = new SteamNetworkingMessage_t();
unsigned long size = connect_socket->second.data.front().size(); unsigned long size = connect_socket->second.data.front().size();
@ -872,8 +901,8 @@ int ReceiveMessagesOnListenSocket( HSteamListenSocket hSocket, SteamNetworkingMe
SteamNetworkingMessage_t *msg = NULL; SteamNetworkingMessage_t *msg = NULL;
int messages = 0; int messages = 0;
auto socket_conn = std::begin(connect_sockets); auto socket_conn = std::begin(s->connect_sockets);
while (socket_conn != std::end(connect_sockets) && messages < nMaxMessages) { while (socket_conn != std::end(s->connect_sockets) && messages < nMaxMessages) {
if (socket_conn->second.listen_socket_id == hSocket) { if (socket_conn->second.listen_socket_id == hSocket) {
while (messages < nMaxMessages && (msg = get_steam_message_connection(socket_conn->first))) { while (messages < nMaxMessages && (msg = get_steam_message_connection(socket_conn->first))) {
ppOutMessages[messages] = msg; ppOutMessages[messages] = msg;
@ -895,8 +924,8 @@ bool GetConnectionInfo( HSteamNetConnection hConn, SteamNetConnectionInfo_t *pIn
return false; return false;
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) return false; if (connect_socket == s->connect_sockets.end()) return false;
set_steamnetconnectioninfo(connect_socket, pInfo); set_steamnetconnectioninfo(connect_socket, pInfo);
@ -924,8 +953,8 @@ EResult GetConnectionRealTimeStatus( HSteamNetConnection hConn, SteamNetConnecti
{ {
PRINT_DEBUG("%s %u %p %i %p\n", __FUNCTION__, hConn, pStatus, nLanes, pLanes); PRINT_DEBUG("%s %u %p %i %p\n", __FUNCTION__, hConn, pStatus, nLanes, pLanes);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) return k_EResultNoConnection; if (connect_socket == s->connect_sockets.end()) return k_EResultNoConnection;
if (pStatus) { if (pStatus) {
pStatus->m_eState = convert_status(connect_socket->second.status); pStatus->m_eState = convert_status(connect_socket->second.status);
@ -1102,7 +1131,7 @@ bool CreateSocketPair( HSteamNetConnection *pOutConnection1, HSteamNetConnection
remote_identity.SetSteamID(settings->get_local_steam_id()); remote_identity.SetSteamID(settings->get_local_steam_id());
HSteamNetConnection con1 = new_connect_socket(remote_identity, 0, SNS_DISABLED_PORT, CONNECT_SOCKET_CONNECTED, k_HSteamListenSocket_Invalid, k_HSteamNetConnection_Invalid); HSteamNetConnection con1 = new_connect_socket(remote_identity, 0, SNS_DISABLED_PORT, CONNECT_SOCKET_CONNECTED, k_HSteamListenSocket_Invalid, k_HSteamNetConnection_Invalid);
HSteamNetConnection con2 = new_connect_socket(remote_identity, 0, SNS_DISABLED_PORT, CONNECT_SOCKET_CONNECTED, k_HSteamListenSocket_Invalid, con1); HSteamNetConnection con2 = new_connect_socket(remote_identity, 0, SNS_DISABLED_PORT, CONNECT_SOCKET_CONNECTED, k_HSteamListenSocket_Invalid, con1);
connect_sockets[con1].remote_id = con2; s->connect_sockets[con1].remote_id = con2;
*pOutConnection1 = con1; *pOutConnection1 = con1;
*pOutConnection2 = con2; *pOutConnection2 = con2;
return true; return true;
@ -1180,8 +1209,8 @@ EResult ConfigureConnectionLanes( HSteamNetConnection hConn, int nNumLanes, cons
{ {
PRINT_DEBUG("TODO: %s\n", __FUNCTION__); PRINT_DEBUG("TODO: %s\n", __FUNCTION__);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) return k_EResultNoConnection; if (connect_socket == s->connect_sockets.end()) return k_EResultNoConnection;
//TODO //TODO
return k_EResultOK; return k_EResultOK;
} }
@ -1253,7 +1282,7 @@ HSteamNetPollGroup CreatePollGroup()
++poll_group_counter; ++poll_group_counter;
HSteamNetPollGroup poll_group_number = poll_group_counter; HSteamNetPollGroup poll_group_number = poll_group_counter;
poll_groups[poll_group_number] = std::list<HSteamNetConnection>(); s->poll_groups[poll_group_number] = std::list<HSteamNetConnection>();
return poll_group_number; return poll_group_number;
} }
@ -1266,19 +1295,19 @@ bool DestroyPollGroup( HSteamNetPollGroup hPollGroup )
{ {
PRINT_DEBUG("Steam_Networking_Sockets::DestroyPollGroup\n"); PRINT_DEBUG("Steam_Networking_Sockets::DestroyPollGroup\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto group = poll_groups.find(hPollGroup); auto group = s->poll_groups.find(hPollGroup);
if (group == poll_groups.end()) { if (group == s->poll_groups.end()) {
return false; return false;
} }
for (auto c : group->second) { for (auto c : group->second) {
auto connect_socket = connect_sockets.find(c); auto connect_socket = s->connect_sockets.find(c);
if (connect_socket != connect_sockets.end()) { if (connect_socket != s->connect_sockets.end()) {
connect_socket->second.poll_group = k_HSteamNetPollGroup_Invalid; connect_socket->second.poll_group = k_HSteamNetPollGroup_Invalid;
} }
} }
poll_groups.erase(group); s->poll_groups.erase(group);
return true; return true;
} }
@ -1300,20 +1329,20 @@ bool SetConnectionPollGroup( HSteamNetConnection hConn, HSteamNetPollGroup hPoll
{ {
PRINT_DEBUG("Steam_Networking_Sockets::SetConnectionPollGroup %u %u\n", hConn, hPollGroup); PRINT_DEBUG("Steam_Networking_Sockets::SetConnectionPollGroup %u %u\n", hConn, hPollGroup);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto connect_socket = connect_sockets.find(hConn); auto connect_socket = s->connect_sockets.find(hConn);
if (connect_socket == connect_sockets.end()) { if (connect_socket == s->connect_sockets.end()) {
return false; return false;
} }
auto group = poll_groups.find(hPollGroup); auto group = s->poll_groups.find(hPollGroup);
if (group == poll_groups.end() && hPollGroup != k_HSteamNetPollGroup_Invalid) { if (group == s->poll_groups.end() && hPollGroup != k_HSteamNetPollGroup_Invalid) {
return false; return false;
} }
HSteamNetPollGroup old_poll_group = connect_socket->second.poll_group; HSteamNetPollGroup old_poll_group = connect_socket->second.poll_group;
if (old_poll_group != k_HSteamNetPollGroup_Invalid) { if (old_poll_group != k_HSteamNetPollGroup_Invalid) {
auto group = poll_groups.find(hPollGroup); auto group = s->poll_groups.find(hPollGroup);
if (group != poll_groups.end()) { if (group != s->poll_groups.end()) {
group->second.remove(hConn); group->second.remove(hConn);
} }
} }
@ -1346,8 +1375,8 @@ int ReceiveMessagesOnPollGroup( HSteamNetPollGroup hPollGroup, SteamNetworkingMe
{ {
PRINT_DEBUG("Steam_Networking_Sockets::ReceiveMessagesOnPollGroup %u %i\n", hPollGroup, nMaxMessages); PRINT_DEBUG("Steam_Networking_Sockets::ReceiveMessagesOnPollGroup %u %i\n", hPollGroup, nMaxMessages);
std::lock_guard<std::recursive_mutex> lock(global_mutex); std::lock_guard<std::recursive_mutex> lock(global_mutex);
auto group = poll_groups.find(hPollGroup); auto group = s->poll_groups.find(hPollGroup);
if (group == poll_groups.end()) { if (group == s->poll_groups.end()) {
return 0; return 0;
} }
@ -1361,6 +1390,7 @@ int ReceiveMessagesOnPollGroup( HSteamNetPollGroup hPollGroup, SteamNetworkingMe
} }
} }
PRINT_DEBUG("Steam_Networking_Sockets::ReceiveMessagesOnPollGroup out %i\n", messages);
return messages; return messages;
} }
@ -1962,7 +1992,7 @@ void Callback(Common_Message *msg)
} }
if (msg->low_level().type() == Low_Level::DISCONNECT) { if (msg->low_level().type() == Low_Level::DISCONNECT) {
for (auto & connect_socket : connect_sockets) { for (auto & connect_socket : s->connect_sockets) {
if (connect_socket.second.remote_identity.GetSteamID64() == msg->source_id()) { if (connect_socket.second.remote_identity.GetSteamID64() == msg->source_id()) {
enum connect_socket_status old_status = connect_socket.second.status; enum connect_socket_status old_status = connect_socket.second.status;
connect_socket.second.status = CONNECT_SOCKET_TIMEDOUT; connect_socket.second.status = CONNECT_SOCKET_TIMEDOUT;
@ -1973,18 +2003,19 @@ void Callback(Common_Message *msg)
} }
if (msg->has_networking_sockets()) { if (msg->has_networking_sockets()) {
PRINT_DEBUG("Steam_Networking_Sockets: got network socket msg %u\n", msg->networking_sockets().type()); PRINT_DEBUG("Steam_Networking_Sockets: got network socket msg %u %llu\n", msg->networking_sockets().type(), msg->source_id());
if (msg->networking_sockets().type() == Networking_Sockets::CONNECTION_REQUEST) { if (msg->networking_sockets().type() == Networking_Sockets::CONNECTION_REQUEST) {
int virtual_port = msg->networking_sockets().virtual_port(); int virtual_port = msg->networking_sockets().virtual_port();
int real_port = msg->networking_sockets().real_port(); int real_port = msg->networking_sockets().real_port();
uint64 dest_id = msg->dest_id();
std::vector<Listen_Socket>::iterator conn; std::vector<Listen_Socket>::iterator conn;
if (virtual_port == SNS_DISABLED_PORT) { if (virtual_port == SNS_DISABLED_PORT) {
conn = std::find_if(listen_sockets.begin(), listen_sockets.end(), [&real_port](struct Listen_Socket const& conn) { return conn.real_port == real_port;}); conn = std::find_if(s->listen_sockets.begin(), s->listen_sockets.end(), [&real_port,&dest_id](struct Listen_Socket const& conn) { return conn.real_port == real_port && dest_id == conn.created_by.ConvertToUint64();});
} else { } else {
conn = std::find_if(listen_sockets.begin(), listen_sockets.end(), [&virtual_port](struct Listen_Socket const& conn) { return conn.virtual_port == virtual_port;}); conn = std::find_if(s->listen_sockets.begin(), s->listen_sockets.end(), [&virtual_port,&dest_id](struct Listen_Socket const& conn) { return conn.virtual_port == virtual_port && dest_id == conn.created_by.ConvertToUint64();});
} }
if (conn != listen_sockets.end()) { if (conn != s->listen_sockets.end()) {
SteamNetworkingIdentity identity; SteamNetworkingIdentity identity;
identity.SetSteamID64(msg->source_id()); identity.SetSteamID64(msg->source_id());
HSteamNetConnection new_connection = new_connect_socket(identity, virtual_port, real_port, CONNECT_SOCKET_NOT_ACCEPTED, conn->socket_id, msg->networking_sockets().connection_id_from()); HSteamNetConnection new_connection = new_connect_socket(identity, virtual_port, real_port, CONNECT_SOCKET_NOT_ACCEPTED, conn->socket_id, msg->networking_sockets().connection_id_from());
@ -1992,8 +2023,8 @@ void Callback(Common_Message *msg)
} }
} else if (msg->networking_sockets().type() == Networking_Sockets::CONNECTION_ACCEPTED) { } else if (msg->networking_sockets().type() == Networking_Sockets::CONNECTION_ACCEPTED) {
auto connect_socket = connect_sockets.find(msg->networking_sockets().connection_id()); auto connect_socket = s->connect_sockets.find(msg->networking_sockets().connection_id());
if (connect_socket != connect_sockets.end()) { if (connect_socket != s->connect_sockets.end()) {
if (connect_socket->second.remote_identity.GetSteamID64() == 0) { if (connect_socket->second.remote_identity.GetSteamID64() == 0) {
connect_socket->second.remote_identity.SetSteamID64(msg->source_id()); connect_socket->second.remote_identity.SetSteamID64(msg->source_id());
} }
@ -2005,15 +2036,16 @@ void Callback(Common_Message *msg)
} }
} }
} else if (msg->networking_sockets().type() == Networking_Sockets::DATA) { } else if (msg->networking_sockets().type() == Networking_Sockets::DATA) {
auto connect_socket = connect_sockets.find(msg->networking_sockets().connection_id()); auto connect_socket = s->connect_sockets.find(msg->networking_sockets().connection_id());
if (connect_socket != connect_sockets.end()) { if (connect_socket != s->connect_sockets.end()) {
if (connect_socket->second.remote_identity.GetSteamID64() == msg->source_id() && connect_socket->second.status == CONNECT_SOCKET_CONNECTED) { if (connect_socket->second.remote_identity.GetSteamID64() == msg->source_id() && connect_socket->second.status == CONNECT_SOCKET_CONNECTED) {
PRINT_DEBUG("Steam_Networking_Sockets: got data len %u on connection %u\n", msg->networking_sockets().data().size(), connect_socket->first);
connect_socket->second.data.push(msg->networking_sockets().data()); connect_socket->second.data.push(msg->networking_sockets().data());
} }
} }
} else if (msg->networking_sockets().type() == Networking_Sockets::CONNECTION_END) { } else if (msg->networking_sockets().type() == Networking_Sockets::CONNECTION_END) {
auto connect_socket = connect_sockets.find(msg->networking_sockets().connection_id()); auto connect_socket = s->connect_sockets.find(msg->networking_sockets().connection_id());
if (connect_socket != connect_sockets.end()) { if (connect_socket != s->connect_sockets.end()) {
if (connect_socket->second.remote_identity.GetSteamID64() == msg->source_id() && connect_socket->second.status == CONNECT_SOCKET_CONNECTED) { if (connect_socket->second.remote_identity.GetSteamID64() == msg->source_id() && connect_socket->second.status == CONNECT_SOCKET_CONNECTED) {
enum connect_socket_status old_status = connect_socket->second.status; enum connect_socket_status old_status = connect_socket->second.status;
connect_socket->second.status = CONNECT_SOCKET_CLOSED; connect_socket->second.status = CONNECT_SOCKET_CLOSED;