예제 #1
0
        //Fonction permettant d'établir une nouvelle connexion
        public ConnexionReseau EtablirConnexion(int addrSrouce, int addreDest, int niec)
        {
            sem.WaitOne();      //Blocage
            //Création de la connexion
            ConnexionReseau conn = new ConnexionReseau(connexionsTotales, addrSrouce, addreDest, niec);

            listeConnexions.Add(conn);
            connexionsTotales++;
            sem.Release();      //Déblocage
            return(conn);
        }
        //Fonction permettant de déconnecter la voie logique
        private void deconnecterVoieLogique(int no_conn, String raison)
        {
            //Récupération de la connexion et retrait
            ConnexionReseau conn = connexions.findConnexionWithNum(no_conn);

            connexions.RetirerConnexion(conn);
            int addrDestination = conn.getAdresseDestination();

            //Affichage à la console du message de déconnexion
            Utility.AfficherDansConsole("*Réseau : " + raison + " - Déconnexion de " + conn.getNIEC() + "*", Constantes.ERREUR_COLOR);

            //Envoie de la primitive de déconnexion
            ecrire_vers_transport(conn.getNIEC() + ";" + N_DISCONNECT.ind + ";" + addrDestination + ";" + raison);
        }
예제 #3
0
        //Fonction permettant de retrouver une connexion selon son numéro de voie logique
        public ConnexionReseau findConnexionWithNum(int num)
        {
            ConnexionReseau conn = null;

            sem.WaitOne();      //Blocage
            foreach (ConnexionReseau c in listeConnexions)
            {
                if (c.getNumeroConnexion() == num)
                {
                    conn = c;
                    break;
                }
            }
            sem.Release();      //Déblocage
            return(conn);
        }
        //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);
            }
        }
예제 #5
0
        //Fonction permettant de modifier le P(R) d'une connexion
        public void ModifierPR(int num, int val)
        {
            ConnexionReseau conn = this.findConnexionWithNum(num);

            conn.setPR((conn.getPR() + val) % 8);
        }
예제 #6
0
 //Fonction permettant de retirer une connexion dans la table
 public void RetirerConnexion(ConnexionReseau conn)
 {
     sem.WaitOne();
     listeConnexions.Remove(conn);
     sem.Release();
 }