public P2PServer(P2PNetwork owner, string playerName, byte[] playerData, string gameName, bool openToInternet, bool sideChannelAuth, ulong sideChannelId) { this.owner = owner; owner.Log("Starting P2P Server"); // Directly setup info about the current game (it's good to be the server): owner.GameInfo = new GameInfo(gameName, openToInternet, sideChannelAuth); OpenToConnections(openToInternet, sideChannelAuth); IPEndPoint myAddress = owner.GetInternalEndpoint(); owner.LocalPeerInfo = new PeerInfo() { ConnectionId = nextConnectionId++, PlayerName = playerName.FilterName(), PlayerData = playerData, InputAssignment = AssignInput(), InternalEndPoint = myAddress, ExternalEndPoint = myAddress, // <- we have no way to determine our external IP (except for UPnP, which is unreliable); we could STUN but technically it can change! SideChannelId = sideChannelId, IsApplicationConnected = true, IsServer = true, }; owner.Log("I am " + owner.LocalPeerInfo); }
/// <summary>Construct for host migration only!</summary> internal P2PServer(P2PNetwork owner, bool hostMigrationValidatedByServer, int maxConnectionId) { this.owner = owner; owner.Log("Becoming P2P Server (host migration)"); hostMigrationTime = NetTime.Now; clientDisconnections = new ClientDisconnections(); if (hostMigrationValidatedByServer) { ValidateHostMigration(); } owner.LocalPeerInfo.IsServer = true; // Recover information from application-connected peer list: var leavingPeers = new List <RemotePeer>(); foreach (var remotePeer in owner.RemotePeers) { Debug.Assert(remotePeer.PeerInfo.IsApplicationConnected); Debug.Assert(remotePeer.PeerInfo.ConnectionId <= maxConnectionId); Debug.Assert(remotePeer.PeerInfo.InputAssignment != 0); Debug.Assert((assignedInputs & remotePeer.PeerInfo.InputAssignment) == 0); assignedInputs |= remotePeer.PeerInfo.InputAssignment; Debug.Assert(!(remotePeer.PeerInfo.IsServer && remotePeer.IsConnected)); // old server should not still be connected if (remotePeer.IsConnected) { locallyConnected.Add(remotePeer.Connection); } // Anyone not connected will get removed from the game in CompleteHostMigration remotePeer.PeerInfo.IsServer = false; // Un-server-ify the original server } // And also from ourself: Debug.Assert(owner.LocalPeerInfo.IsApplicationConnected); Debug.Assert(owner.LocalPeerInfo.ConnectionId <= maxConnectionId); Debug.Assert(owner.LocalPeerInfo.InputAssignment != 0); Debug.Assert((assignedInputs & owner.LocalPeerInfo.InputAssignment) == 0); assignedInputs |= owner.LocalPeerInfo.InputAssignment; // This should be safe, as host migration should remove all traces peers beyond this point (including in the app layer) and is atomic nextConnectionId = maxConnectionId + 1; }
private void NetworkDataError(RemotePeer remotePeer, Exception exception) { owner.Log("Network data error from " + (remotePeer != null ? remotePeer.PeerInfo.ToString() : "unknown peer")); owner.LogException(exception); if (remotePeer != null) { Kick(remotePeer); // buh-bye } }