/// <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"); }
async Task <ConnectingStaticData> ReceiveStaticDataAsync() { var sData = ConnectingStaticData.Decode(await Communication.TCPReceiveMessageAsync(serverConnection)); Console.WriteLine("Received static data from the server."); return(sData); }
/// <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(); } }
private void BuildEngine(ConnectingStaticData sData) { var world = new Engine.World(sData.Arena); engine = new Engine.Engine(world); }