Some steam networking accuracy improvements.
parent
968cd6d601
commit
51a5e3bc27
|
@ -85,7 +85,7 @@ message Network {
|
|||
|
||||
enum Types {
|
||||
DATA = 0;
|
||||
CLEAR_BEFORE = 1;
|
||||
NEW_CONNECTION = 1;
|
||||
}
|
||||
|
||||
Types type = 3;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
//packet timeout in seconds for non connections
|
||||
#define ORPHANED_PACKET_TIMEOUT (20)
|
||||
#define NEW_CONNECTION_TIMEOUT (20.0)
|
||||
|
||||
#define OLD_CHANNEL_NUMBER 1
|
||||
|
||||
|
@ -72,6 +73,8 @@ public ISteamNetworking
|
|||
std::vector<struct steam_listen_socket> listen_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)
|
||||
{
|
||||
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);
|
||||
|
||||
if (!connection_exists(steamIDRemote)) {
|
||||
msg.mutable_network()->set_type(Network::CLEAR_BEFORE);
|
||||
msg.mutable_network()->set_type(Network::NEW_CONNECTION);
|
||||
network->sendTo(&msg, true);
|
||||
}
|
||||
|
||||
|
@ -257,6 +260,8 @@ bool SendP2PPacket( CSteamID steamIDRemote, const void *pubData, uint32 cubData,
|
|||
msg.mutable_network()->set_type(Network::DATA);
|
||||
|
||||
struct Steam_Networking_Connection *conn = get_or_create_connection(steamIDRemote);
|
||||
new_connection_times.erase(steamIDRemote);
|
||||
|
||||
conn->open_channels.insert(nChannel);
|
||||
bool ret = network->sendTo(&msg, reliable);
|
||||
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");
|
||||
if (pcubMsgSize) *pcubMsgSize = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -335,6 +341,8 @@ bool ReadP2PPacket( void *pubDest, uint32 cubDest, uint32 *pcubMsgSize, CSteamID
|
|||
++msg;
|
||||
}
|
||||
|
||||
if (pcubMsgSize) *pcubMsgSize = 0;
|
||||
if (psteamIDRemote) *psteamIDRemote = k_steamIDNil;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -355,6 +363,7 @@ bool AcceptP2PSessionWithUser( CSteamID steamIDRemote )
|
|||
PRINT_DEBUG("Steam_Networking::AcceptP2PSessionWithUser %llu\n", steamIDRemote.ConvertToUint64());
|
||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||
struct Steam_Networking_Connection *conn = get_or_create_connection(steamIDRemote);
|
||||
if (conn) new_connection_times.erase(steamIDRemote);
|
||||
return !!conn;
|
||||
}
|
||||
|
||||
|
@ -591,7 +600,11 @@ bool IsDataAvailableOnSocket( SNetSocket_t hSocket, uint32 *pcubMsgSize )
|
|||
PRINT_DEBUG("Steam_Networking::IsDataAvailableOnSocket\n");
|
||||
std::lock_guard<std::recursive_mutex> lock(global_mutex);
|
||||
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 (pcubMsgSize) *pcubMsgSize = socket->data_packets[0].data().size();
|
||||
return true;
|
||||
|
@ -745,10 +758,13 @@ void RunCallbacks()
|
|||
CSteamID source_id((uint64)msg.source_id());
|
||||
if (!msg.network().processed()) {
|
||||
if (!connection_exists(source_id)) {
|
||||
P2PSessionRequest_t data;
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.m_steamIDRemote = CSteamID(source_id);
|
||||
callbacks->addCBResult(data.k_iCallback, &data, sizeof(data), 0.1, true);
|
||||
if (new_connection_times.find(source_id) == new_connection_times.end()) {
|
||||
P2PSessionRequest_t data;
|
||||
memset(&data, 0, sizeof(data));
|
||||
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 {
|
||||
struct Steam_Networking_Connection *conn = get_or_create_connection(source_id);
|
||||
conn->open_channels.insert(msg.network().channel());
|
||||
|
@ -779,13 +795,22 @@ void RunCallbacks()
|
|||
|
||||
//TODO: not sure if sockets should be wiped right away
|
||||
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)
|
||||
{
|
||||
if (msg->has_network()) {
|
||||
#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) {
|
||||
PRINT_DEBUG("%02hhX", msg->network().data().data()[i]);
|
||||
}PRINT_DEBUG("\n");
|
||||
|
@ -795,11 +820,11 @@ void Callback(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);
|
||||
while (msg_temp != std::end(messages)) {
|
||||
//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);
|
||||
} else {
|
||||
++msg_temp;
|
||||
|
|
Loading…
Reference in New Issue