/* Método que gerencia o processo de monitoramento da porta de * comunicação. É recomendado que este método seja executado em uma * thread exclusiva. * Além de iniciar o processo de escuta de uma porta, este método * recebe as requisições das aplicações clientes, encaminha ao * servidor de jogos (referenciado pela variável server) e envia * a resposta das mensagens aos clientes. */ public void startUDPServer() { Console.WriteLine("Starting UDP echo at ip: " + ip + " port: " + port); int receivedDataLength; byte[] data = new byte[65530]; IPEndPoint ipEP = new IPEndPoint(IPAddress.Parse(ip), port); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint tmpRemote = (EndPoint)(sender); socket.Bind(ipEP); while (!ended) { string message = ""; string answer_message = ""; byte[] response = new byte[65530]; try { sender = new IPEndPoint(IPAddress.Any, 0); tmpRemote = (EndPoint)(sender); data = new byte[65530]; receivedDataLength = socket.ReceiveFrom(data, ref tmpRemote); message = Encoding.ASCII.GetString(data, 0, receivedDataLength); Console.WriteLine("Received: '" + message + "'"); AddressPort ClientAddress = new AddressPort(sender.Address, sender.Port); RequestMessage req_message = new RequestMessage(message, ClientAddress); AnswerMessage am = GameServer.executeRequest(req_message); if (am.GID >= 0) { am.GAME_GENERAL_STATUS = GameServer.gameGeneralStatus(am.GID, req_message.PLAYER); } else { am.GAME_GENERAL_STATUS = AnswerMessage.GGS_NOTHING_TO_BE_DONE; } answer_message = am.message2string(); response = Encoding.ASCII.GetBytes(answer_message); } catch (Exception e) { if (System.Type.Equals(new SocketException().GetType(), e.GetType())) { ended = true; return; } else { Console.Error.WriteLine("ERROR: " + message + " " + e.ToString()); answer_message = new AnswerMessage(false, AnswerMessage.UNKNOWN_ERROR, "", -1).message2string(); response = Encoding.ASCII.GetBytes(answer_message); } } if (!ended) { Console.WriteLine("Sending: " + answer_message); socket.SendTo(response, response.Length, SocketFlags.None, tmpRemote); server.insertLogMessage("INPUT", message); server.insertLogMessage("OUTPUT", answer_message); } } }
/* Método que gerencia o processo de monitoramento da porta de * comunicação. É recomendado que este método seja executado em uma * thread exclusiva. * Além de iniciar o processo de escuta de uma porta, este método * recebe as requisições das aplicações clientes, encaminha ao * servidor de jogos (referenciado pela variável server) e envia * a resposta das mensagens aos clientes. */ public void startTCPServer() { Console.WriteLine("Starting TCP echo at ip: " + ip + " port: " + port); listener = new TcpListener(IPAddress.Parse(ip), port); listener.Start(); TcpClient ourTCP_Client = null; NetworkStream ourStream = null; while (!ended) { string message = ""; string answer_message = ""; byte[] response = new byte[65530]; try { ourTCP_Client = listener.AcceptTcpClient(); ourStream = ourTCP_Client.GetStream(); byte[] data = new byte[ourTCP_Client.ReceiveBufferSize]; int bytesRead = ourStream.Read(data, 0, System.Convert.ToInt32(ourTCP_Client.ReceiveBufferSize)); // echo the data we got to the console until the newline, and delay closing our window. message = Encoding.ASCII.GetString(data, 0, bytesRead); Console.WriteLine("Received: '" + message + "'"); AddressPort ClientAddress = new AddressPort(IPAddress.Parse("172.16.36.85"), 8623); RequestMessage req_message = new RequestMessage(message, ClientAddress); AnswerMessage am = GameServer.executeRequest(req_message); if (am.GID >= 0) { am.GAME_GENERAL_STATUS = GameServer.gameGeneralStatus(am.GID, req_message.PLAYER); } else { am.GAME_GENERAL_STATUS = AnswerMessage.GGS_NOTHING_TO_BE_DONE; } answer_message = am.message2string(); response = Encoding.ASCII.GetBytes(answer_message); } catch (Exception e) { if (System.Type.Equals(new SocketException().GetType(), e.GetType())) { ended = true; if (ourTCP_Client != null) { ourStream.Flush(); ourStream.Close(); ourTCP_Client.Close(); } listener.Stop(); return; } else { Console.Error.WriteLine("ERROR: " + message + " " + e.Message); answer_message = new AnswerMessage(false, AnswerMessage.UNKNOWN_ERROR, "", -1).message2string(); response = Encoding.ASCII.GetBytes(answer_message); } } if (!ended) { server.insertLogMessage("INPUT", message); server.insertLogMessage("OUTPUT", answer_message); Console.WriteLine("Sending: " + answer_message); ourStream.Write(response, 0, response.Length); ourStream.Flush(); ourTCP_Client.Close(); } } return; }