/// <summary> /// Starts listening for connections and updates. /// </summary> /// <param name="sDataGenerator">Function that generates static data for newly connected clients.</param> public ClientsManager(SDataGeneratorDelegate sDataGenerator) { active = true; readyClients = ImmutableList <ReadyClient> .Empty; connectedClients = new Dictionary <int, ConnectedClient>(); clientUpdates = ImmutableList <ClientUpdate> .Empty; serverCommandsSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ListenForClientUpdatesAsync().Detach(); ListenForConnectionsAsync(sDataGenerator).Detach(); }
/// <summary> /// Starts listening for incoming connections to the server. /// </summary> async Task ListenForConnectionsAsync(SDataGeneratorDelegate sDataGenerator) { var endPoint = new IPEndPoint(IPAddress.Any, Ports.serverConnection); connectionListener = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); /// Next available client/player ID. int nextClientID = 0; connectionListener.Bind(endPoint); connectionListener.Listen(5); while (active) { Console.WriteLine("Listening for a client..."); Socket client = await Task.Factory.FromAsync(connectionListener.BeginAccept, connectionListener.EndAccept, null); int playerID = nextClientID++; ConnectingStaticData con = sDataGenerator(playerID); HandleClientConnectionAssync(client, playerID, con).Detach(); } }