//Fonction privée permettant de traiter une primitive venant de la couche transport
        private void traiterPrimitiveDeTransport(string strPrimitive)
        {
            //Affichage de la primitive reçue
            Utility.AfficherDansConsole("Reseau reçoit de transport : " + strPrimitive, Constantes.TRANSPORT_RESEAU_COLOR);

            //On sépare la primitive pour retrouver ses paramètres
            string[] split     = strPrimitive.Split(';');
            string   primitive = split [1];

            //Traitement de la primitive
            if (primitive == N_CONNECT.req.ToString())                                                  //APPEL DE CONNEXION-----------------
            {
                int addrSource = Convert.ToInt32(split [2]);

                if (addrSource % 27 != 0)                                                               //Le fournisseur internet accepte la connexion
                //Parametres : Adresse Source, Adresse Destination, NIEC
                {
                    ConnexionReseau conn = connexions.EtablirConnexion(Convert.ToInt32(split [2]), Convert.ToInt32(split [3]), Convert.ToInt32(split [0]));

                    //Parametres : NIEC, Adresse Source, Adresse Destination
                    PaquetAppel paquet  = new PaquetAppel(conn.getNumeroConnexion(), conn.getAdresseSource(), conn.getAdresseDestination());
                    Paquet      reponse = liaison.TraiterPaquetDeReseau(paquet);
                    TraiterPaquetDeLiaison(reponse, paquet, true);
                }
                else                                                                                                    //Le fournisseur internet refuse la connexion
                {
                    ConnexionReseau conn = connexions.findConnexionWithNIEC(Convert.ToInt32(split [0]));
                    //Parametres : NIEC, Primitive, Adresse Source, Adresse Destination
                    ecrire_vers_transport(split [0] + ";" + N_DISCONNECT.ind + ";" + split [3] + ";" + Constantes.RAISON_REFUS_FOURNISSEUR);
                }
            }
            else if (primitive == N_DATA.req.ToString())                                //ENVOI DE DONNÉES------------------
            {
                int             niec    = Convert.ToInt32(split [0]);
                String          donnees = split[2];
                ConnexionReseau conn;

                //Segmentation des données à envoyée
                //On vérifie d'abord s'il reste des données à envoyer, et si la connexion existe toujours (car la connexion peut être perdue
                //en cours de traitement
                while (donnees.Length > 0 && (conn = connexions.findConnexionWithNIEC(niec)) != null)
                {
                    int    count = Math.Min(donnees.Length, 128);
                    String data  = donnees.Substring(0, count);                                                                //On récupère au maximum 128 caractères de données
                    donnees = donnees.Remove(0, count);                                                                        //Et on l'enlève de la chaîne d'origine
                    int           m       = (data.Length == 128 ? 1 : 0);                                                      //Valeur de M : 0 - Il n'y a plus d'autre paquet à transmettre, 1 - Il y en a d'autre
                    PaquetDonnees paquet  = new PaquetDonnees(conn.getNumeroConnexion(), conn.getPR(), conn.getPS(), m, data); //Paquet de données
                    Paquet        reponse = liaison.TraiterPaquetDeReseau(paquet);
                    connexions.ModifierPS(conn.getNumeroConnexion(), 1);                                                       //Augmentation de la valeur de P(S)
                    TraiterPaquetDeLiaison(reponse, paquet, true);                                                             //Appel de la fonction pour traiter le paquet reçu de Liaison
                }
            }
            else if (primitive == N_DISCONNECT.req.ToString())                          //DÉCONNEXION
            {
                int niec = Convert.ToInt32(split [0]);
                //On retrouve la connexion et on la retire
                ConnexionReseau conn = connexions.findConnexionWithNIEC(niec);
                connexions.RetirerConnexion(conn);

                //Construction du paquet pour libérer la connexion du coté liaison
                PaquetDemandeLiberation paquet = new PaquetDemandeLiberation(conn.getNumeroConnexion(), conn.getAdresseSource(), conn.getAdresseDestination());
                liaison.TraiterPaquetDeReseau(paquet);
            }
        }
        //Fonction permettant de traiter un paquet reçu de la couche Liaison
        private void TraiterPaquetDeLiaison(Paquet reponse, Paquet origin, bool renvoi)
        {
            if (reponse == null)                        //Aucune réponse... Tentative de renvoi
            {
                if (renvoi)
                {
                    Utility.AfficherDansConsole("*Réseau : Aucune réponse de la couche liaison, tentative de renvoi...*", Constantes.ERREUR_COLOR);
                    reponse = liaison.TraiterPaquetDeReseau(origin);
                    TraiterPaquetDeLiaison(reponse, origin, false);
                }
                else
                {
                    deconnecterVoieLogique(origin.numero_connexion, "Aucune reponse du distant");
                }
            }
            else                                                        //Traitement de la réponse
            //Affichage du paquet reçu
            {
                Utility.AfficherDansConsole("Réseau recoit de Liaison : " + reponse.ToString(), Constantes.RESEAU_LIAISON_COLOR);

                ConnexionReseau conn;
                if (reponse is PaquetConnexionEtablie)                                          //Paquet de connexion établie----------------
                {
                    PaquetConnexionEtablie p = (PaquetConnexionEtablie)reponse;
                    conn = connexions.findConnexionWithNum(p.numero_connexion);
                    ecrire_vers_transport(conn.getNIEC() + ";" + N_CONNECT.conf + ";" + conn.getAdresseDestination());
                }
                else if (reponse is PaquetIndicationLiberation)                                 //Paquet d'indication de libération----------
                {
                    PaquetIndicationLiberation p = (PaquetIndicationLiberation)reponse;
                    conn = connexions.findConnexionWithNum(p.numero_connexion);
                    ecrire_vers_transport(conn.getNIEC() + ";" + N_DISCONNECT.ind + ";" + conn.getAdresseDestination() + ";" + p.raison);
                }
                else if (reponse is PaquetAcquittement)                                         //Paquet d'acquittement----------------------
                {
                    PaquetAcquittement p    = (PaquetAcquittement)reponse;
                    string             type = p.typePaquet.Substring(1);

                    if (type == Constantes.TYPE_PAQUET_ACQUITTEMENT_POSITIF)                        //Acquittement positif-----------------------
                    {
                        conn = connexions.findConnexionWithNum(reponse.numero_connexion);
                        ecrire_vers_transport(conn.getNIEC() + ";" + N_DATA.ind + ";" + conn.getAdresseSource() + ";" + conn.getAdresseDestination());
                        connexions.ModifierPR(reponse.numero_connexion, 1);                         //Modification du P(R) de la connexion
                    }
                    else                                                                            //Acquittement négatif - On tente de renvoyer le paquet
                    {
                        if (renvoi)
                        {
                            //Tentative de renvoi du paquet
                            Utility.AfficherDansConsole("*Réseau : Acquittement négatif de Liaison - Tentative de renvoi*", Constantes.ERREUR_COLOR);
                            Paquet p_rep = liaison.TraiterPaquetDeReseau(origin);
                            TraiterPaquetDeLiaison(p_rep, origin, false);
                        }
                        else
                        {
                            //Déconnexion de la voie logique
                            deconnecterVoieLogique(origin.numero_connexion, "Acquittement negatif");
                        }
                    }
                }
            }
        }
예제 #3
0
        //Fonction permettant de traiter un paquet reçu de la couche Réseau
        public Paquet TraiterPaquetDeReseau(Paquet paquet)
        {
            //Affichage du paquet reçu
            Utility.AfficherDansConsole("Liaison recoit de réseau : " + paquet.ToString(), Constantes.RESEAU_LIAISON_COLOR);
            Utility.EcrireDansFichier("L_ecr.txt", paquet.ToString(), true);

            //Traitement du paquet
            Paquet reponse = null;

            if (paquet is PaquetAppel)                      //Paquet d'appel----------------------------------
            {
                PaquetAppel p          = (PaquetAppel)paquet;
                int         addrSource = p.adresseSource;

                if (addrSource % 13 == 0)                                           //REFUS DE LA CONNEXION DU DISTANT
                {
                    reponse = new PaquetIndicationLiberation(p.numero_connexion, p.adresseSource, p.adresseDestination, Constantes.RAISON_REFUS_DISTANT);
                }
                else if (addrSource % 19 == 0)                                      //AUCUNE RÉPONSE DE LA COUCHE LIAISON
                {
                    reponse = null;
                }
                else                                                                        //ACCEPTATION DE LA CONNEXION
                {
                    connexions.AjouterConnexion(p.numero_connexion, p.adresseSource, p.adresseDestination);
                    reponse = new PaquetConnexionEtablie(p.numero_connexion, p.adresseSource, p.adresseDestination);
                }
            }
            else if (paquet is PaquetDonnees)               //Paquet de données----------------------------------
            {
                PaquetDonnees    p    = (PaquetDonnees)paquet;
                ConnexionLiaison conn = connexions.findConnexion(paquet.numero_connexion);
                int rdm = new Random().Next(8);
                if (conn.getAdresseSource() % 15 == 0)                                  //Pas de reponse-------------------------------------
                {
                    reponse = null;
                }
                else if (p.pS == rdm)                                                   //Acquittement négatif
                {
                    reponse = new PaquetAcquittement(p.numero_connexion, p.pR, false);
                }
                else                                                                                    //Acquittement positif
                {
                    Utility.AfficherDansConsole("Donnees bien recues : " + p.donnees, Constantes.OUTPUT_COLOR);
                    reponse = new PaquetAcquittement(p.numero_connexion, p.pR + 1, true);

                    //Écriture dans le fichier
                    donneesEnCours += p.donnees;

                    //Si M est égale à 0, cela veut dire que la couche réseau à bien transmis tout ses paquets de données
                    //On peut donc écrire la chaîne dans le fichier de sortie et la réinitialiser
                    if (p.M == 0)
                    {
                        Utility.EcrireDansFichier("S_ecr.txt", donneesEnCours, true);
                        donneesEnCours = "";
                    }
                }
            }
            else if (paquet is PaquetDemandeLiberation)     //Paquet Demande Liberation--------------------------
            {
                PaquetDemandeLiberation p = (PaquetDemandeLiberation)paquet;
                connexions.RetirerConnexion(p.numero_connexion);
            }

            //Écriture du paquet à envoyer dans le fichier de sortie L_lec.txt
            if (reponse != null)
            {
                Utility.EcrireDansFichier("L_lec.txt", reponse.ToString(), true);
            }

            return(reponse);
        }