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