Net: the Steam transport -- FakeIP + SDR behind the wire seam (step 4b)

NEW gated (BT_STEAM) TU L4STEAMNET: ISteamNetworkingSockets with FakeIP --
pseudo-SOCKET handles (0x5EA0xxxx) behind the L4NET BTNet* seam; the engine
TCP byte stream rides reliable-NoNagle Steam messages re-assembled into
per-connection rings (nonblocking recv semantics preserved: empty ->
WSAEWOULDBLOCK, peer-closed -> 0); two FakeIP ports mirror the arcade
console/game channel convention; listen sockets + accept queues via the
global status-changed callback; graceful degrade to Winsock at every step.
Seam completions in L4NET.CPP: CheckSocket reports a pseudo-socket peer as
its FAKE ipv4:port (the lobby egg roster matches unchanged); OpenConnection
TCP_OPEN delegates FakeIP targets to BTSteamNet_Connect.  WinMain installs
on BT_STEAM_NET=1 (lobby launch path / by hand).  CMake: gated SDK include/
lib/dll-copy.  Both pumps (SteamAPI_RunCallbacks + sockets RunCallbacks)
drive it -- the FakeIP result rides the GENERAL dispatch (first attempt with
only the sockets pump timed out).

Verified live (ON/ON build, Steam client running): SteamAPI_Init OK,
steam_appid.txt(480) auto-written, FakeIP allocated
(169.254.36.58, console 54464 / game 54465); without BT_STEAM_NET or
without Steam the game stays pure Winsock.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-17 23:47:47 -05:00
co-authored by Claude Fable 5
parent e79e8faeed
commit 48ede2f7d7
6 changed files with 701 additions and 20 deletions
+12
View File
@@ -378,6 +378,18 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
}
BTFE_RelaunchSelfAndExit(fe_arguments); // never returns
}
#ifdef BT_STEAM
//
// The Steam transport (step 4b): BT_STEAM_NET=1 (set by the lobby
// launch path, or by hand for testing) brings up FakeIP + SDR
// before the engine opens any connection. Degrades to Winsock.
//
if (getenv("BT_STEAM_NET") != NULL && *getenv("BT_STEAM_NET") != '0')
{
extern int BTSteamNet_Install();
BTSteamNet_Install();
}
#endif
//
// A marshal-armed mission process: start the LocalConsole worker
// (it retries until our own console listener is up).