Skip to content

Fix some cases of Steam connection leak - #998

Open
mibac138 wants to merge 4 commits into
rwmt:devfrom
mibac138:disconnect-fix
Open

mibac138 wants to merge 4 commits into
rwmt:devfrom
mibac138:disconnect-fix

Conversation

@mibac138

Copy link
Copy Markdown
Member

Fixes an issue where a connection is leaked and prevents a user from re-joining a game. This does not fix all issues with reconnecting. Consider the following scenario:

  • user connects, clicks fix and restart
  • server does not receive a disconnection packet: connection is closed by the client, SteamP2P does not flush or provide a way to flush remaining packets nor does it send any disconnection message on it's own
  • client restarts
  • client reconnects. if the client took longer than the P2P session timeout (15s? not sure), the server will have the previous connection already removed and the client can rejoin. otherwise, the client still cannot join (server still considers the old connection valid, the new connection is merged into it, and the server doesn't allow a single connection to create a player twice) and the old workaround still applies (/kick)

Later on, I'd like to switch from SteamP2P to SteamNetworkingSockets which provide a richer API and should allow to fully solve this issue (e.g. close connection with a reason and wait until the reason is sent)

Register a disconnect packet handler in ClientSteamState so an early
server rejection displays its reason and ends the connection.
Should fix an issue where a player connecting through Steam and being rejected by the server did not receive any disconnection packet and was stuck in Connecting
base.OnClose(goodbye);
// TODO It's not documented in the API, but from manual tests it appears that CloseP2PSession does not flush
// any queued messages, so the Send above effectively does nothing. It's left as it is though, as that's
// the correct behavior and should eventually be fixed (possibly by switching to Steam Networking Sockets,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Switch to Steam Networking Sockets already exists https://github.com/RimWorld-mods-patches/Multiplayer/pull/4/changes

I just wanted to merge a simpler fix first but it was never merged
#958

seatemplar10-dev added a commit to seatemplar10-dev/Multiplayer that referenced this pull request Nov 2, 2026
…n that is active again

Since the rwmt#998 port the Steam client closes its P2P session on every leave. A fail callback for that
old session can arrive after the restarted client joined again (row 266 drops the old player). The
server lookup goes by Steam id only, so it dropped the new player. The server now skips the fail when
GetP2PSessionState says the session to that Steam id is active. Fork-only, not part of rwmt#998.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants