//===========================================================================// // File: l4steamtransport.h // // Project: MUNGA Brick: Steam Network Transport // // Contents: NetTransport over ISteamNetworkingSockets (FakeIP) // //---------------------------------------------------------------------------// // Copyright (C) 1994-1995, Virtual World Entertainment, Inc. // // PROPRIETARY AND CONFIDENTIAL // //===========================================================================// #pragma once #include "..\munga\style.h" //######################################################################## // SteamNetTransport - the retail wire (l4steamtransport.cpp). Built // only under RP412_STEAM (Steamworks SDK vendored at // extern\steamworks_sdk_164; steam_api.dll ships beside the exe). // // Method mapping onto ISteamNetworkingSockets: // // Install SteamAPI_Init + InitRelayNetworkAccess, then // BeginAsyncRequestFakeIP(2): fake port 0 is the // console channel, fake port 1 the game mesh. // On success installs itself via NetTransport_Set; // on any failure the process stays on Winsock TCP. // GetLocalAddresses our FakeIP (the mesh identifies "which [pilots] // entry is me" against it). // Resolve SteamNetworkingIPAddr::ParseString - FakeIPs ARE // IPv4 strings, so egg text stays unchanged. // Connect ConnectByIPAddress to the peer's FakeIP + fake // game port (SDR routes it; NAT traversal and IP // privacy come free); blocks pumping callbacks // until Connected, retrying like the TCP // connect-while-refused loop. // Listen CreateListenSocketP2PFakeIP - first engine port // seen maps to fake port 0, second to fake port 1. // Accept connection-request callback AcceptConnections // queue up; Accept() pops fully-connected ones. // Send SendMessageToConnection, reliable lane (the // engine's stream framing assumes ordered // reliable delivery). // Receive ReceiveMessagesOnConnection into the caller's // buffer; normalized to ReceiveNoData / // ReceiveDisconnected like the Winsock transport. // GetRemoteAddress GetRemoteFakeIPForConnection, with the fake // port translated back to the ENGINE port so the // mesh's SOCKADDR_IN identity checks keep working. // // Addressing convention under Steam: every pod launches with the same // -net port (the lobby fixes it), so the egg's [pilots] entries are // ":" - the engine's self-match and peer // checks all work on engine ports, and only this transport knows the // Steam-assigned fake port values. The lobby layer exchanges each // member's FakeIP + fake game port and feeds RegisterPeer before the // egg is distributed. //######################################################################## #ifdef RP412_STEAM // Bring Steam up and make this the process transport. False (with the // reason logged) leaves the Winsock transport in place - callers just // carry on over TCP. Logical SteamNetTransport_Install(); // Our FakeIP as a dotted string ("169.254.x.y"), for lobby member data // and the [pilots] list. Empty until Install succeeds. const char * SteamNetTransport_GetFakeAddressString(); // Our Steam-assigned fake game port (lobby member data). int SteamNetTransport_GetFakeGamePort(); // The lobby feeds every member's FakeIP + fake game port here before // StartConnecting runs. void SteamNetTransport_RegisterPeer( const char *fake_ip, int fake_game_port ); #endif // RP412_STEAM