public void TcpReadCallback(IAsyncResult ar) { TcpStateObject state = (TcpStateObject)ar.AsyncState; Socket tcp_socket = state.tcpSocket; int bytesRead = 0; try { bytesRead = tcp_socket.EndReceive(ar); } catch (Exception e) { Console.WriteLine("Exception handled : {0} in TcpReadCallback EndReceive()", e.Message); } if (bytesRead > 0) { // Parse m_MessageParser.ParseMessage(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); // Clear state.buffer = new byte[ServerDefs.BUFF_SIZE]; // Start a new callback state.tcpSocket.BeginReceive(state.buffer, 0, ServerDefs.BUFF_SIZE, 0, new AsyncCallback(TcpReadCallback), state ); } else { // Shut down Logger.Log("Removing client as forced shutdown and closing sockets"); m_ServerManager.RemoveClient(tcp_socket); // Re-allocate next time we get a client if (m_ServerManager.NumClients() == 0) { m_GameSimulation.ClearGameData(); } Logger.Log(string.Format("Number of clients: {0}", m_ServerManager.NumClients()), Logger.LogPrio.Warning); } }