Example #1
0
        /// <summary>
        /// Envia de facto a mensagem para o servidor (trata do problema do control-c
        /// </summary>
        /// <param name="mensagem">Mensagem a ser enviada para o outro servidor</param>
        private static void enviaMensagemParaServidor(MensagemServidor mensagem)
        {
            Servidor servidorDestino = Servidor.GetServidor(mensagem._idDestinatarioMensagem, ServerMain.TodosServidores);
             try
             {
            //envia mensagem para o cliente
            servidorDestino.Ligacao.MessageQueue(mensagem);

            //Se nao der erro
            //Se for uma mensagem da qual espero retorno (pode haver timeout)
            if (mensagem.EMsgComRetorno() == true)
            {
               Configuration.Debug("Vou meter para enviar uma mensagem do tipo:" + mensagem.Tipo + " para: " + mensagem._idDestinatarioMensagem, Configuration.PRI_MIN);
               //Só as mensagens do tipo de servidor é que podem ter retorno
               MensagemServidor msg = (MensagemServidor)mensagem;
               lock (_lstRespostasMensagensPendentes)
               {
                  _lstRespostasMensagensPendentes.Add(msg);
               }
            }

             }
             catch (System.Runtime.Remoting.RemotingException exception)
             {
            if (servidorDestino.Vivo == false)
            {
               Configuration.Debug("Comunicaçao morreu a meio porque o outro servidor fechou-se a meio. Era o esperado.", Configuration.PRI_MAX);
               return;
            }
            //para tirar o warning
            exception.GetType();
            string msgErro = "Servidor morto com control-C, vou remover da lista de servidores, redistribuir todos jogos e avisar outros";
            Configuration.Debug("Servidor morto: " + mensagem._idDestinatarioMensagem + " tipo: " + mensagem.Tipo, Configuration.PRI_MAX);
            Configuration.Debug(msgErro, Configuration.PRI_MAX);

            TrataDescobertaMorteServidor(servidorDestino.Identificacao, mensagem.IdCliente, mensagem.IdJogo, mensagem.NumSala);
             }
             catch (System.Net.Sockets.SocketException exception)
             {
            if (servidorDestino.Vivo == false)
            {
               Configuration.Debug("Comunicaçao morreu a meio porque o outro servidor fechou-se a meio. Era o esperado.", Configuration.PRI_MAX);
               return;
            }
            //para tirar o warning
            exception.GetType();
            string msgErro = "Servidor morto com control-C, vou remover da lista de servidores, redistribuir todos jogos e avisar outros";
            Configuration.Debug("Servidor morto: " + mensagem._idDestinatarioMensagem + " tipo: " + mensagem.Tipo, Configuration.PRI_MAX);
            Configuration.Debug(msgErro, Configuration.PRI_MAX);

            TrataDescobertaMorteServidor(servidorDestino.Identificacao, mensagem.IdCliente, mensagem.IdJogo, mensagem.NumSala);
             }
        }