Ejemplo n.º 1
0
#pragma warning disable RECS0135 // Function does not reach its end or a 'return' statement by any of possible execution paths
        public void StartTimer()
#pragma warning restore RECS0135 // Function does not reach its end or a 'return' statement by any of possible execution paths
        {
            while (true)
            {
                RouteXML.SendRoutingTables();
                Thread.Sleep(Constants.TIME_TO_SLEEP);
            }
        }
Ejemplo n.º 2
0
        public String ProcessMsg(string content, String respuesta)
        {
            bool        esProtocolo = false;
            XmlDocument xDoc        = new XmlDocument();

            //parseamos el mensaje para pasar los parámetros de conexion

            try{
                xDoc.LoadXml(content);
            }
            catch (Exception e) {
                log.Fatal("Message XML structure malformed: " + e.Message + "--> " + e.StackTrace, e);
                return("");
            }

            String clienteDestino = "", clienteOrigen = "", codigo = "", ip_origen = "";

            //El cliente destino y origen del mensaje original
            try{
                clienteDestino = xDoc.GetElementsByTagName("destination")[0].InnerText;
                clienteOrigen  = xDoc.GetElementsByTagName("source")[0].InnerText;
            }
            catch (Exception e) {
                log.Fatal("Message Fields malformed: " + e.Message + ": " + e.StackTrace, e);
                return("");
            }

            respuesta = content;

            //Mis ips
            IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());

            // Enumerate IP addresses
            String nIP;

            foreach (IPAddress ipaddress in iphostentry.AddressList)
            {
                nIP = Constants.ipPublica.ToString();

                //Si recibo el mensaje de un cliente hacia mi mismo
                if (clienteDestino == nIP && this._origen == Constants.CLIENTE)
                {
                    RemoteDatabase db = new RemoteDatabase();

                    //Si es una nueva conexion la registramos en la tabla de rutas
                    if (xDoc.GetElementsByTagName("message_type")[0].InnerText == "010")
                    {
                        log.Info("Actualizando estado en la tabla de rutas del cliente '" +
                                 clienteOrigen + "'");

                        ip_origen = xDoc.GetElementsByTagName("ip")[0].InnerText;
                        RouteXML.PrepararRuta(clienteOrigen, ip_origen, nIP);

                        log.Info(clienteOrigen + "ha realizado la conexión con exito.");
                        esProtocolo = true;
                    }
                    else if (xDoc.GetElementsByTagName("message_type")[0].InnerText == "011")
                    {
                        codigo = xDoc.GetElementsByTagName("code")[0].InnerText;
                        if (db.CheckCode(clienteOrigen, codigo))
                        {
                            log.Info("Anunciando nombre al cliente '" + clienteOrigen + "'");
                            respuesta = AnunciarNombresAlCliente(xDoc, content);
                        }
                        else
                        {
                            respuesta = "El cliente que se ha intentado conectar no es legítimo";
                            log.Error(respuesta);
                            return("");
                        }

                        esProtocolo = true;
                    }
                }
                //Si recibo un mensaje de un GK hacia mi mismo
                else if (clienteDestino == nIP && this._origen == Constants.GATEKEEPER)
                {
                    log.Info("Recibida tabla de rutas...actualizando rutas.");
                    RouteXML.merge(content);
                    esProtocolo = true;
                }
            }

            if (!esProtocolo)
            {
                //Si tenemos la direccion de destino en nuestra tabla de rutas
                if (this._clienteDireccion.ContainsKey(clienteDestino))
                {
                    //Por defecto usamos d_hop para reenviarlo al siguiente GK
                    IPAddress ip_dest = _clienteDireccion[clienteDestino];

                    //Si resulta que la distancia es 0 usamos la d_node
                    if (this._clienteDistancia[clienteDestino] == 0)
                    {
                        ip_dest = RouteXML.CargarIP(clienteDestino);
                    }
                    else
                    {
                        this._port = Constants.PORT_SENDING_TO_GATEKEEPER;
                    }

                    log.Info("Enviando a " + ip_dest + "al puerto " + this._port);
                    respuesta = BindSocket(ip_dest, content, clienteDestino);
                }
                else if (this._vecinos.Contains(clienteDestino))
                {
                    //Si resulta que la dirección de destino es un GK vecino
                    //enviamos usando el puerto para GK
                    var match = this._vecinos
                                .FirstOrDefault(stringToCheck => stringToCheck.Contains(clienteDestino));
                    this._port = Constants.PORT_SENDING_TO_GATEKEEPER;
                    if (match != null)
                    {
                        BindSocket(IPAddress.Parse(match), content, clienteOrigen);
                    }
                    else
                    {
                        log.Warn("Aviso de incoherencia con neighbours.xml: El " +
                                 "vecino" + clienteDestino + "aparece en routes.xml" +
                                 "pero no en neihbours.xml.");
                    }
                    respuesta = "";
                }
                else
                {
                    log.Error("Destino no encontrado");
                }
            }

            return(respuesta);
        }