//===========================================================================// // 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 ports (lobby member data): the console // channel and the game mesh. int SteamNetTransport_GetFakeConsolePort(); int SteamNetTransport_GetFakeGamePort(); // The engine-side port convention for this session (default 1501; // game port is +1). Connect() maps an engine port in a SOCKADDR_IN to // the peer's matching Steam fake port. void SteamNetTransport_SetEnginePorts(int console_port); // The lobby feeds every member's FakeIP + fake ports + SteamID here // before anything dials out. The SteamID matters on accept: Steam // reports incoming callers under locally-allocated alias addresses, // so the transport maps the caller's identity back to the global // FakeIP the egg promised. Registering is idempotent per IP. void SteamNetTransport_RegisterPeer( const char *fake_ip, int fake_console_port, int fake_game_port, unsigned __int64 steam_id ); #endif // RP412_STEAM