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