public void Start()
        {
            try
            {
                listener.Start();
                Log($"Listening on {listener.LocalEndpoint}");

                while (true)
                {
                    var client  = listener.AcceptSocket();
                    var session = new Tcp_Session(client, this);
                    new Thread(session.Start).Start();
                }
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine($"Server error: {e}");
            }
            finally
            {
                foreach (var peer in sessions.Values)
                {
                    if (peer.client.Connected)
                    {
                        peer.Log("Closing connection to server");
                        peer.client.Close();
                    }
                }
            }
        }
예제 #2
0
 public bool TryJoin(Tcp_Session session)
 {
     if (peers.Count >= capacity)
     {
         return(false);
     }
     return(peers.TryAdd(session.id, session));
 }
 private void LeaveLobby()
 {
     // cannot leave a started lobby
     Log($"Leaving lobby {joined_lobby.id}");
     joined_lobby.peers.Remove(id);
     if (joined_lobby.peers.Count == 0)
     {
         server.lobbies.Remove(joined_lobby.id);
     }
     else if (joined_lobby.host_id == id)
     {
         Tcp_Session new_host = joined_lobby.peers.Values.First();
         new_host.BecomeHost();
     }
     joined_lobby = null;
 }
 private void MakeHost(Tcp_Session session)
 {
     TransitionState(Tcp_State.PeerWithinLobby);
     session.TransitionState(Tcp_State.HostWithinLobby);
     session.BecomeHost();
 }