public void Update() { if (network == null) { // // Before Network Startup // if (Input.KeyWentDown(Keys.F3)) // Simulate bad network conditions { badNetworkSimPreset = BadNetworkSimulation.NextPreset(badNetworkSimPreset); console.WriteLine(BadNetworkSimulation.GetPreset(badNetworkSimPreset).ToString()); } if (Input.KeyWentDown(Keys.F1)) // Start Network { network = createNetwork(BadNetworkSimulation.GetPreset(badNetworkSimPreset)); network.OnExternalEndpointDiscovered += ExternalEndpointDiscovered; network.StartDiscovery(); } } else { // // After Network Started // if (Input.Control && Input.KeyWentDown(Keys.S)) { network.RequestExternalEndpoint(); } if (rollbackDriver == null) { // // Before Game Start/Connect // if (Input.KeyWentDown(Keys.F4)) { useSideChannelAuth = !useSideChannelAuth; } bool internet = false; if (Input.KeyWentDown(Keys.F1) || (internet = Input.KeyWentDown(Keys.F2))) // Start Internet or LAN game { network.StopDiscovery(); console.WriteLine(internet ? "Starting Internet Game..." : "Starting LAN Game...", Color.DarkRed); network.StartGame(CreateRollbackDriverAndGame(), "Player", localPlayerData, "Default Game", internet, useSideChannelAuth, 0); if (!network.UsingKnownPort) { console.WriteLine("To connect to this game on LAN, connect to: " + network.LocalPeerInfo.InternalEndPoint, Color.Red); } } // Hard coded for this test... const ulong sideChannelId = 1; // Endpoint to connect to for game client: IPEndPoint clientConnectTo = null; if (commandLineHost != null && Input.KeyWentDown(Keys.F3)) { try { clientConnectTo = network.ParseAndResolveEndpoint(commandLineHost); } catch { clientConnectTo = null; } if (clientConnectTo == null) { console.WriteLine("Failed to parse or resolve endpoint: \"" + commandLineHost + "\""); commandLineHost = null; } } if (network.Discovery != null) { for (int i = 0; i < network.Discovery.Items.Count; i++) // Join Discovered Game { if (Input.KeyWentDown(Keys.D0 + i) && network.Discovery.Items[i].CanJoin) { DiscoveredGame discoveredGame = network.Discovery.Items[i]; clientConnectTo = discoveredGame.EndPoint; console.WriteLine("Selected discovererd game: " + discoveredGame.GameInfo.Name, Color.DarkRed); break; } } } if (clientConnectTo != null) { network.StopDiscovery(); console.WriteLine("Connecting to " + clientConnectTo, Color.DarkRed); network.ConnectToGame(CreateRollbackDriverAndGame(), "Player", localPlayerData, useSideChannelAuth ? null : clientConnectTo, sideChannelId, sideChannelToken); if (useSideChannelAuth) { network.SideChannelTryVerifyAndConnect(clientConnectTo); // <- Use the verify path if we're using side-channel auth } } } else { // // After game start: // if (useSideChannelAuth && network.IsServer) { if (Input.KeyWentDown(Keys.F8)) { if (!tokenIssued) { tokenIssued = true; sideChannelToken = network.SideChannelAdd(1); console.WriteLine("Token issued: " + sideChannelToken); } else { tokenIssued = false; network.SideChannelRemove(1); // Kick any user connected to the network with this ID console.WriteLine("Token revoked"); } } } } } }
private static void Main(string[] args) { Console.Title = "P2P Test"; const int msPerFrame = 16; #region Startup mode select Console.WriteLine("Connection Testing Program. Escape to exit."); Console.WriteLine(); Console.WriteLine("[Z] = Toggle bad network simulation"); Console.WriteLine("[Q] = Add player data"); Console.WriteLine("[space] = Begin"); Console.WriteLine(); var badNetworkSimPreset = 0; byte[] localPlayerData = null; while (true) { var keyInfo = Console.ReadKey(true); var key = keyInfo.Key; if (key == ConsoleKey.Escape) { return; } if (key == ConsoleKey.Spacebar) { break; } if (key == ConsoleKey.Q) { if ((keyInfo.Modifiers & ConsoleModifiers.Shift) == 0) { Array.Resize(ref localPlayerData, localPlayerData == null ? 1 : localPlayerData.Length + 1); localPlayerData[localPlayerData.Length - 1] = (byte)(localPlayerData.Length - 1); } else if (localPlayerData != null && localPlayerData.Length > 0) { Array.Resize(ref localPlayerData, localPlayerData.Length - 1); } Console.WriteLine("Player data length = " + localPlayerData.Length); } if (key == ConsoleKey.Z) { badNetworkSimPreset = BadNetworkSimulation.NextPreset(badNetworkSimPreset); Console.WriteLine(BadNetworkSimulation.GetPreset(badNetworkSimPreset).ToString()); } } #endregion #region Network Game Menu (and LAN Discovery) var appConfig = new NetworkAppConfig("P2P Test", new[] { 20001, 20002, 20003, 20004, 20005, 20006 }, SimpleNetworkGame.ProtocolVersion, null); var network = new P2PNetwork(appConfig, new ConsoleLogHandler(), BadNetworkSimulation.GetPreset(badNetworkSimPreset)); SimpleNetworkGame networkGame; Console.Title = "P2P Test - Port " + network.PortNumber; network.StartDiscovery(); network.Discovery.OnItemsChanged += PrintNetworkMenu; // Will keep reprinting menu during discovery // Print initial menu directly: PrintNetworkMenu(network.Discovery); while (true) { // Poll network network.Update(); // Handle Input if (Console.KeyAvailable) { var keyPress = Console.ReadKey(true); // Exit if (keyPress.Key == ConsoleKey.Escape) { goto Shutdown; } // Select a discovered server if (keyPress.Key >= ConsoleKey.D0 && keyPress.Key <= ConsoleKey.D9) { var selection = keyPress.Key - ConsoleKey.D0; if (selection >= 0 && selection < network.Discovery.Items.Count && network.Discovery.Items[selection].CanJoin) { var discoveredGame = network.Discovery.Items[selection]; network.StopDiscovery(); Console.WriteLine(); Console.WriteLine("Connecting to game: " + discoveredGame.GameInfo.Name); network.ConnectToGame(networkGame = new SimpleNetworkGame(network), "Player", localPlayerData, discoveredGame.EndPoint, 0, 0); break; } } // Start an Internet or LAN game: var internet = false; if (keyPress.Key == ConsoleKey.F1 || (internet = keyPress.Key == ConsoleKey.F2)) { network.StopDiscovery(); Console.WriteLine(); Console.WriteLine(internet ? "Starting Internet Game..." : "Starting LAN Game..."); network.StartGame(networkGame = new SimpleNetworkGame(network), "Player", localPlayerData, "Default Game", internet, false, 0); break; } // Join a specific game host: if (keyPress.Key == ConsoleKey.F3) { Console.WriteLine(); Console.WriteLine("Enter host to connect to:"); var userHost = Console.ReadLine(); IPEndPoint endpoint = null; try { endpoint = network.ParseAndResolveEndpoint(userHost); } catch { } if (endpoint == null) { Console.WriteLine("Failed to parse or resolve endpoint: \"" + endpoint + "\""); } else { network.StopDiscovery(); Console.WriteLine("Connecting to game at " + endpoint); network.ConnectToGame(networkGame = new SimpleNetworkGame(network), "Player", localPlayerData, endpoint, 0, 0); break; } } } Thread.Sleep(msPerFrame); } #endregion #region Run Network while (true) { // Poll network network.Update(); networkGame.Update(); // Handle Input if (Console.KeyAvailable) { var keyPress = Console.ReadKey(true); // Exit if (keyPress.Key == ConsoleKey.Escape) { goto Shutdown; } networkGame.HandleKeyPress(keyPress); } Thread.Sleep(msPerFrame); } #endregion #region Shutdown Shutdown: network.Shutdown().Wait(1500); #endregion }