/// <summary>
        /// Recibir la confirmación final del cliente para empezar a recibir mensajes de la aplicación
        /// </summary>
        /// <returns>True si todo salio bien</returns>
        private bool getClientOkResponse(TgcSocketClientInfo clientInfo, Socket socket)
        {
            try
            {
                //Recibir respuesta final del cliente
                TgcSocketRecvMsg msg = TgcSocketMessages.receiveMessage(socket, TgcSocketMessageHeader.MsgType.InitialMessage);
                if (msg == null)
                {
                    return(false);
                }

                //Respuesta del cliente
                //bool userOk = bool.Parse(msg.readString());
                bool userOk = (bool)msg.readNext();
                if (userOk)
                {
                    //Habilitar estado de cliente para escuchar mensajes
                    clientInfo.Status = TgcSocketClientInfo.ClientStatus.Connected;
                    connectedClients.Add(clientInfo);

                    //Guardar en la lista de nuevos clientes conectados
                    newConnectedClients.Enqueue(clientInfo);
                }

                return(userOk);
            }
            catch (SocketException)
            {
                return(false);
            }
        }
        /// <summary>
        /// Recibir informacion inicial del server
        /// </summary>
        /// <returns>True si todo salio bien</returns>
        private bool getServerInitialInfo()
        {
            try
            {
                //Recibir info inicial del server
                TgcSocketRecvMsg msg = TgcSocketMessages.receiveMessage(clientSocket, TgcSocketMessageHeader.MsgType.InitialMessage);
                if (msg == null)
                {
                    return(false);
                }

                //Guardar sus datos y cambiar su estado
                TgcSocketInitialInfoServer serverInitInfo = (TgcSocketInitialInfoServer)msg.readNext();
                serverInfo.Name = serverInitInfo.serverName;
                playerId        = serverInitInfo.playerId;

                //Enviar OK final
                this.status = TgcSocketClientInfo.ClientStatus.Connected;
                TgcSocketSendMsg sendMsg = new TgcSocketSendMsg();
                sendMsg.write(true);
                return(TgcSocketMessages.sendMessage(clientSocket, sendMsg, TgcSocketMessageHeader.MsgType.InitialMessage));
            }
            catch (SocketException)
            {
                return(false);
            }
        }
        /// <summary>
        /// Recibir información inicial del cliente
        /// </summary>
        /// <returns>True si todo salio bien</returns>
        private bool getClientInitialInfo(TgcSocketClientInfo clientInfo, Socket socket)
        {
            try
            {
                //Recibir info inicial del cliente
                TgcSocketRecvMsg msg = TgcSocketMessages.receiveMessage(socket, TgcSocketMessageHeader.MsgType.InitialMessage);
                if (msg == null)
                {
                    return(false);
                }

                //Guardar sus datos y cambiar su estado
                TgcSocketInitialInfoClient clientInitInfo = (TgcSocketInitialInfoClient)msg.readNext();
                clientInfo.Name   = clientInitInfo.clientName;
                clientInfo.Status = TgcSocketClientInfo.ClientStatus.WaitingClientOk;

                //Asignar Player ID a cliente
                TgcSocketInitialInfoServer serverInitInfo = new TgcSocketInitialInfoServer();
                serverInitInfo.serverName = serverName;
                serverInitInfo.playerId   = playerIdCounter;
                clientInfo.PlayerId       = serverInitInfo.playerId;
                playerIdCounter++;

                //Enviar info inicial del server
                TgcSocketSendMsg sendMsg = new TgcSocketSendMsg();
                sendMsg.write(serverInitInfo);
                TgcSocketMessages.sendMessage(socket, sendMsg, TgcSocketMessageHeader.MsgType.InitialMessage);

                return(true);
            }
            catch (SocketException)
            {
                return(false);
            }
        }
        /// <summary>
        /// Recibe un mensaje de TGC por un socket
        /// </summary>
        /// <param name="socket">Socket del cual recibir</param>
        /// <param name="msgType">Tipo de mensaje esperado</param>
        /// <returns>Mensaje recibido o null si recibió mal</returns>
        public static TgcSocketRecvMsg receiveMessage(Socket socket, TgcSocketMessageHeader.MsgType msgType)
        {
            try
            {
                //Recibir header
                byte[] headerData = new byte[TgcSocketMessageHeader.HEADER_SIZE];
                int    recv       = socket.Receive(headerData, headerData.Length, SocketFlags.None);
                if (recv == TgcSocketMessageHeader.HEADER_SIZE)
                {
                    int msgLength = BitConverter.ToInt32(headerData, 0);

                    //Recibir cuerpo del mensaje
                    byte[] msgData = new byte[msgLength];
                    recv = socket.Receive(msgData, msgData.Length, SocketFlags.None);
                    if (recv == msgLength)
                    {
                        TgcSocketRecvMsg recvMsg = new TgcSocketRecvMsg(msgData);
                        return(recvMsg);
                    }
                }
            }
            catch (Exception)
            {
                return(null);
            }
            return(null);
        }
        /// <summary>
        /// Recibe un mensaje de TGC por un socket
        /// </summary>
        /// <param name="socket">Socket del cual recibir</param>
        /// <param name="msgType">Tipo de mensaje esperado</param>
        /// <returns>Mensaje recibido o null si recibió mal</returns>
        public static TgcSocketRecvMsg receiveMessage(Socket socket, TgcSocketMessageHeader.MsgType msgType)
        {
            try
            {
                //Recibir header
                byte[] headerData = new byte[TgcSocketMessageHeader.HEADER_SIZE];
                int recv = socket.Receive(headerData, headerData.Length, SocketFlags.None);
                if (recv == TgcSocketMessageHeader.HEADER_SIZE)
                {
                    int msgLength = BitConverter.ToInt32(headerData, 0);

                    //Recibir cuerpo del mensaje
                    byte[] msgData = new byte[msgLength];
                    recv = socket.Receive(msgData, msgData.Length, SocketFlags.None);
                    if (recv == msgLength)
                    {
                        TgcSocketRecvMsg recvMsg = new TgcSocketRecvMsg(msgData);
                        return recvMsg;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
            return null;
        }
        /// <summary>
        /// Recibir mensaje del servidor
        /// </summary>
        /// <returns>True si todo salio bien, False en caso de problemas en la conexión</returns>
        private bool getReceiveMessage()
        {
            try
            {
                //Recibir mensaje
                TgcSocketRecvMsg msg = TgcSocketMessages.receiveMessage(clientSocket, TgcSocketMessageHeader.MsgType.RegularMessage);
                if (msg == null)
                {
                    return(false);
                }

                //Agregar a la lista de mensajes pendientes
                receivedMessages.Enqueue(msg);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
        /// <summary>
        /// Lee un mensaje ordinario recibido por el cliente
        /// </summary>
        /// <returns>True si todo salio bien</returns>
        private bool getReceiveMessage(TgcSocketClientInfo clientInfo, Socket socket)
        {
            try
            {
                //Recibir mensaje
                TgcSocketRecvMsg msg = TgcSocketMessages.receiveMessage(socket, TgcSocketMessageHeader.MsgType.RegularMessage);
                if (msg == null)
                {
                    return(false);
                }

                //Agregar a la lista de mensajes pendientes
                receivedMessages.Enqueue(new TgcSocketClientRecvMesg(msg, clientInfo.PlayerId));

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
 public TgcSocketClientRecvMesg(TgcSocketRecvMsg msg, int playerId)
 {
     this.msg      = msg;
     this.playerId = playerId;
 }
 public TgcSocketClientRecvMesg(TgcSocketRecvMsg msg, int playerId)
 {
     this.msg = msg;
     this.playerId = playerId;
 }