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);
            }
        }