Beispiel #1
0
        //Fonction permettant de retirer une connexion dans la liste
        public void RetirerConnexion(int _no)
        {
            sem.WaitOne();      //Blocage
            ConnexionLiaison conn = findConnexion(_no);

            listeConnexions.Remove(conn);
            sem.Release();      //Déblocage
        }
Beispiel #2
0
        //Fonction permettant d'ajouter une nouvelle connexion à la liste
        public ConnexionLiaison AjouterConnexion(int _no, int _adrSource, int _adrDestination)
        {
            sem.WaitOne();      //Blocage
            ConnexionLiaison conn = new ConnexionLiaison(_no, _adrSource, _adrDestination);

            listeConnexions.Add(conn);
            sem.Release();      //Déblocage
            return(conn);
        }
Beispiel #3
0
        //Fonction permettant de trouver une connexion selon le numéro passé en paramètre
        public ConnexionLiaison findConnexion(int _no)
        {
            ConnexionLiaison conn = null;

            sem.WaitOne();      //Blocage
            foreach (ConnexionLiaison c in listeConnexions)
            {
                if (c.getNumeroConnexion() == _no)
                {
                    conn = c;
                    break;
                }
            }
            sem.Release();      //Déblocage

            return(conn);
        }
        //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);
        }