mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-14 10:50:13 +01:00
Some steam networking accuracy improvements.
This commit is contained in:
parent
968cd6d601
commit
51a5e3bc27
2 changed files with 36 additions and 11 deletions
|
@ -85,7 +85,7 @@ message Network {
|
||||||
|
|
||||||
enum Types {
|
enum Types {
|
||||||
DATA = 0;
|
DATA = 0;
|
||||||
CLEAR_BEFORE = 1;
|
NEW_CONNECTION = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Types type = 3;
|
Types type = 3;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
//packet timeout in seconds for non connections
|
//packet timeout in seconds for non connections
|
||||||
#define ORPHANED_PACKET_TIMEOUT (20)
|
#define ORPHANED_PACKET_TIMEOUT (20)
|
||||||
|
#define NEW_CONNECTION_TIMEOUT (20.0)
|
||||||
|
|
||||||
#define OLD_CHANNEL_NUMBER 1
|
#define OLD_CHANNEL_NUMBER 1
|
||||||
|
|
||||||
|
@ -71,7 +72,9 @@ public ISteamNetworking
|
||||||
|
|
||||||
std::vector<struct steam_listen_socket> listen_sockets;
|
std::vector<struct steam_listen_socket> listen_sockets;
|
||||||
std::vector<struct steam_connection_socket> connection_sockets;
|
std::vector<struct steam_connection_socket> connection_sockets;
|
||||||
|
|
||||||
|
std::map<CSteamID, std::chrono::high_resolution_clock::time_point> new_connection_times;
|
||||||
|
|
||||||
bool connection_exists(CSteamID id)
|
bool connection_exists(CSteamID id)
|
||||||
{
|
{
|
||||||
return std::find_if(connections.begin(), connections.end(), [&id](struct Steam_Networking_Connection const& conn) { return conn.remote == id;}) != connections.end();
|
return std::find_if(connections.begin(), connections.end(), [&id](struct Steam_Networking_Connection const& conn) { return conn.remote == id;}) != connections.end();
|
||||||
|
@ -248,7 +251,7 @@ bool SendP2PPacket( CSteamID steamIDRemote, const void *pubData, uint32 cubData,
|
||||||
msg.set_allocated_network(new Network);
|
msg.set_allocated_network(new Network);
|
||||||
|
|
||||||
if (!connection_exists(steamIDRemote)) {
|
if (!connection_exists(steamIDRemote)) {
|
||||||
msg.mutable_network()->set_type(Network::CLEAR_BEFORE);
|
msg.mutable_network()->set_type(Network::NEW_CONNECTION);
|
||||||
network->sendTo(&msg, true);
|
network->sendTo(&msg, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,6 +260,8 @@ bool SendP2PPacket( CSteamID steamIDRemote, const void *pubData, uint32 cubData,
|
||||||
msg.mutable_network()->set_type(Network::DATA);
|
msg.mutable_network()->set_type(Network::DATA);
|
||||||
|
|
||||||
struct Steam_Networking_Connection *conn = get_or_create_connection(steamIDRemote);
|
struct Steam_Networking_Connection *conn = get_or_create_connection(steamIDRemote);
|
||||||
|
new_connection_times.erase(steamIDRemote);
|
||||||
|
|
||||||
conn->open_channels.insert(nChannel);
|
conn->open_channels.insert(nChannel);
|
||||||
bool ret = network->sendTo(&msg, reliable);
|
bool ret = network->sendTo(&msg, reliable);
|
||||||
PRINT_DEBUG("Sent message with size: %zu %u\n", msg.network().data().size(), ret);
|
PRINT_DEBUG("Sent message with size: %zu %u\n", msg.network().data().size(), ret);
|
||||||
|
@ -289,6 +294,7 @@ bool IsP2PPacketAvailable( uint32 *pcubMsgSize, int nChannel)
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINT_DEBUG("Not available\n");
|
PRINT_DEBUG("Not available\n");
|
||||||
|
if (pcubMsgSize) *pcubMsgSize = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,6 +341,8 @@ bool ReadP2PPacket( void *pubDest, uint32 cubDest, uint32 *pcubMsgSize, CSteamID
|
||||||
++msg;
|
++msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pcubMsgSize) *pcubMsgSize = 0;
|
||||||
|
if (psteamIDRemote) *psteamIDRemote = k_steamIDNil;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,6 +363,7 @@ bool AcceptP2PSessionWithUser( CSteamID steamIDRemote )
|
||||||
PRINT_DEBUG("Steam_Networking::AcceptP2PSessionWithUser %llu\n", steamIDRemote.ConvertToUint64());
|
PRINT_DEBUG("Steam_Networking::AcceptP2PSessionWithUser %llu\n", steamIDRemote.ConvertToUint64());
|
||||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||||
struct Steam_Networking_Connection *conn = get_or_create_connection(steamIDRemote);
|
struct Steam_Networking_Connection *conn = get_or_create_connection(steamIDRemote);
|
||||||
|
if (conn) new_connection_times.erase(steamIDRemote);
|
||||||
return !!conn;
|
return !!conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -591,7 +600,11 @@ bool IsDataAvailableOnSocket( SNetSocket_t hSocket, uint32 *pcubMsgSize )
|
||||||
PRINT_DEBUG("Steam_Networking::IsDataAvailableOnSocket\n");
|
PRINT_DEBUG("Steam_Networking::IsDataAvailableOnSocket\n");
|
||||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||||
struct steam_connection_socket *socket = get_connection_socket(hSocket);
|
struct steam_connection_socket *socket = get_connection_socket(hSocket);
|
||||||
if (!socket) return false;
|
if (!socket) {
|
||||||
|
if (pcubMsgSize) *pcubMsgSize = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (socket->data_packets.size() == 0) return false;
|
if (socket->data_packets.size() == 0) return false;
|
||||||
if (pcubMsgSize) *pcubMsgSize = socket->data_packets[0].data().size();
|
if (pcubMsgSize) *pcubMsgSize = socket->data_packets[0].data().size();
|
||||||
return true;
|
return true;
|
||||||
|
@ -745,10 +758,13 @@ void RunCallbacks()
|
||||||
CSteamID source_id((uint64)msg.source_id());
|
CSteamID source_id((uint64)msg.source_id());
|
||||||
if (!msg.network().processed()) {
|
if (!msg.network().processed()) {
|
||||||
if (!connection_exists(source_id)) {
|
if (!connection_exists(source_id)) {
|
||||||
P2PSessionRequest_t data;
|
if (new_connection_times.find(source_id) == new_connection_times.end()) {
|
||||||
memset(&data, 0, sizeof(data));
|
P2PSessionRequest_t data;
|
||||||
data.m_steamIDRemote = CSteamID(source_id);
|
memset(&data, 0, sizeof(data));
|
||||||
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1, true);
|
data.m_steamIDRemote = CSteamID(source_id);
|
||||||
|
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1);
|
||||||
|
new_connection_times[source_id] = std::chrono::high_resolution_clock::now();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
struct Steam_Networking_Connection *conn = get_or_create_connection(source_id);
|
struct Steam_Networking_Connection *conn = get_or_create_connection(source_id);
|
||||||
conn->open_channels.insert(msg.network().channel());
|
conn->open_channels.insert(msg.network().channel());
|
||||||
|
@ -779,13 +795,22 @@ void RunCallbacks()
|
||||||
|
|
||||||
//TODO: not sure if sockets should be wiped right away
|
//TODO: not sure if sockets should be wiped right away
|
||||||
remove_killed_connection_sockets();
|
remove_killed_connection_sockets();
|
||||||
|
|
||||||
|
for(auto it = new_connection_times.begin(); it != new_connection_times.end(); ) {
|
||||||
|
if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - it->second).count() > NEW_CONNECTION_TIMEOUT) {
|
||||||
|
it = new_connection_times.erase(it);
|
||||||
|
//TODO send packet to other side to tell them connection has "failed".
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Callback(Common_Message *msg)
|
void Callback(Common_Message *msg)
|
||||||
{
|
{
|
||||||
if (msg->has_network()) {
|
if (msg->has_network()) {
|
||||||
#ifndef EMU_RELEASE_BUILD
|
#ifndef EMU_RELEASE_BUILD
|
||||||
PRINT_DEBUG("Steam_Networking: got msg from: %llu to: %llu size %zu | messages %p: %zu\n", msg->source_id(), msg->dest_id(), msg->network().data().size(), &messages, messages.size());
|
PRINT_DEBUG("Steam_Networking: got msg from: %llu to: %llu size %zu type %u | messages %p: %zu\n", msg->source_id(), msg->dest_id(), msg->network().data().size(), msg->network().type(), &messages, messages.size());
|
||||||
for (int i = 0; i < msg->network().data().size(); ++i) {
|
for (int i = 0; i < msg->network().data().size(); ++i) {
|
||||||
PRINT_DEBUG("%02hhX", msg->network().data().data()[i]);
|
PRINT_DEBUG("%02hhX", msg->network().data().data()[i]);
|
||||||
}PRINT_DEBUG("\n");
|
}PRINT_DEBUG("\n");
|
||||||
|
@ -795,11 +820,11 @@ void Callback(Common_Message *msg)
|
||||||
messages.push_back(Common_Message(*msg));
|
messages.push_back(Common_Message(*msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->network().type() == Network::CLEAR_BEFORE) {
|
if (msg->network().type() == Network::NEW_CONNECTION) {
|
||||||
auto msg_temp = std::begin(messages);
|
auto msg_temp = std::begin(messages);
|
||||||
while (msg_temp != std::end(messages)) {
|
while (msg_temp != std::end(messages)) {
|
||||||
//only delete processed to handle unreliable message arriving at the same time.
|
//only delete processed to handle unreliable message arriving at the same time.
|
||||||
if (msg_temp->source_id() == msg->source_id() && msg->network().processed()) {
|
if (msg_temp->source_id() == msg->source_id() && msg_temp->network().processed()) {
|
||||||
msg_temp = messages.erase(msg_temp);
|
msg_temp = messages.erase(msg_temp);
|
||||||
} else {
|
} else {
|
||||||
++msg_temp;
|
++msg_temp;
|
||||||
|
|
Loading…
Reference in a new issue