Esempio n. 1
0
        /// <summary>
        /// Handles newly connected client.
        /// </summary>
        /// <param name="client">Incoming socket</param>
        /// <param name="ID">ID of the client</param>
        /// <returns>Task that completes when the client has been handled.</returns>
        async Task HandleClientConnectionAssync(Socket client, int ID, ConnectingStaticData con)
        {
            Console.WriteLine($"Connectd to {ID}({client.RemoteEndPoint})");
            await Communication.TCPSendMessageAsync(client, ConnectingStaticData.Encode(con));

            bool clientReady = await Communication.TCPReceiveACKAsync(client);

            Console.WriteLine($"Recieved ACK from {ID}");
            Debug.Assert(clientReady);
            ReadyClient c = new ReadyClient
            {
                playerID         = con.PlayerID,
                dynDataSocket    = client,
                relUpdatesSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp),
            };
            //Establish a channel for reliable updates.
            //TEMP Shift ports by playerID=Allows multiple clients on one computer
            var relAddress = new IPEndPoint((c.dynDataSocket.RemoteEndPoint as IPEndPoint).Address, Ports.relServerUpdates + con.PlayerID);

            c.relUpdatesSocket.Connect(relAddress);
            Console.WriteLine($"Created a reliable channel for server commands fro {ID}.");
            var tmp = readyClients;

            while (tmp != Interlocked.CompareExchange(ref readyClients, tmp.Add(c), tmp))
            {
                tmp = readyClients;
            }

            Console.WriteLine($"{ID} is ready");
        }
Esempio n. 2
0
        async Task <ConnectingStaticData> ReceiveStaticDataAsync()
        {
            var sData = ConnectingStaticData.Decode(await Communication.TCPReceiveMessageAsync(serverConnection));

            Console.WriteLine("Received static data from the server.");
            return(sData);
        }
Esempio n. 3
0
        /// <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();
            }
        }
Esempio n. 4
0
        private void BuildEngine(ConnectingStaticData sData)
        {
            var world = new Engine.World(sData.Arena);

            engine = new Engine.Engine(world);
        }