//Fonction permettant de confirmer une connexion public void ConfirmerConnexion(int _numConn) { ConnexionTransport conn = this[_numConn]; conn.setEtatConnexion(EtatConnexion.CONNECTE); //Affichage en console et écriture dans le fichier de sortie Utility.AfficherDansConsole("Connexion établie pour " + conn.getIdentifiant(), Constantes.OUTPUT_COLOR); Utility.EcrireDansFichier("S_ecr.txt", "Connexion établie pour " + conn.getIdentifiant(), true); }
//Focntion permettant de faire la demande de fermeture de toutes les connexions, utilisée à la fin d'exécution des commandes //du fichier S_lec.txt public void DemanderFermetureConnexions() { while (connexions.nbConnexions > 0) { //Fermeture d'une connexion ConnexionTransport conn = connexions.findConnexionAtIndex(0); ecrire_vers_reseau(conn.getNumeroConnexion() + ";" + N_DISCONNECT.req + ";" + conn.getAdresseDestination()); connexions.FermerConnexion(conn.getNumeroConnexion(), "Fin d'exécution"); } }
//Fonction permettant de traiter une primitive envoyée par la couche Réseau private void TraiterCommandeDeReseau(string commande) { string[] split = commande.Split(';'); int numeroConnexion = Int32.Parse(split [0]); ConnexionTransport conn = connexions[numeroConnexion]; if (split [1] == N_CONNECT.conf.ToString()) //Confirmation de connexion { connexions.ConfirmerConnexion(numeroConnexion); } else if (split [1] == N_DISCONNECT.ind.ToString()) //Indication de déconnexion { connexions.FermerConnexion(numeroConnexion, split[3]); } }
//Fonction permettant d'établir une connexion avec un distant public void EtablirConnexion(string _identifiant) { ConnexionTransport conn = connexions.EtablirConnexion(_identifiant); //Tentative d'ouverture de connexion if (conn != null) { int numConn = conn.getNumeroConnexion(); int addrSource = conn.getAdresseSource(); int addrDestinataire = conn.getAdresseDestination(); //Envoie de la primitive de demande de connexion vers la couche Réseau Utility.EcrireDansFichier("S_ecr.txt", "Ouverture de connexion pour " + _identifiant + "...", true); ecrire_vers_reseau(numConn + ";" + N_CONNECT.req + ";" + addrSource + ";" + addrDestinataire); } }
//Fermeture d'une connexion selon son numéro de connexion public void FermerConnexion(int _numConn, String raison) { ConnexionTransport conn = this [_numConn]; sem.WaitOne(); //Blocage listeConnexions.Remove(conn); //Libération des adresses utilisées adressesUtilises [conn.getAdresseSource()] = false; adressesUtilises [conn.getAdresseDestination()] = false; nbAdressesUtilises -= 2; sem.Release(); //Déblocage //Affichage en console et écriture dans le fichier de sortie Utility.AfficherDansConsole("Fermeture de connexion pour " + conn.getIdentifiant() + " - " + raison, Constantes.OUTPUT_COLOR); Utility.EcrireDansFichier("S_ecr.txt", "Fermeture de connexion pour " + conn.getIdentifiant() + " - " + raison, true); }
//Fonction permettant d'établir une nouvelle connexion public ConnexionTransport EtablirConnexion(string _identifiant) { //On génère deux adresses int adresseSource = GenererAdresse(); int adresseDestinataire = GenererAdresse(); //Plus d'adresses disponibles if (adresseSource == -1 || adresseDestinataire == -1) { Utility.AfficherDansConsole("Plus d'adresses disponibles! Impossible d'établir la connexion.", Constantes.ERREUR_COLOR); return(null); } sem.WaitOne(); //Blocage ConnexionTransport conn = new ConnexionTransport(nbConnexionsTotales, _identifiant, adresseSource, adresseDestinataire); listeConnexions.Add(conn); nbConnexionsTotales++; sem.Release(); //Déblocage return(conn); }
//Fonction permettant de trouver une connexion selon son identifiant d'application public ConnexionTransport this[String identifiant] { get { ConnexionTransport conn = null; sem.WaitOne(); //Blocage for (int i = 0; i < listeConnexions.Count; i++) { try{ ConnexionTransport c = listeConnexions[i]; if (c.getIdentifiant().Equals(identifiant)) { conn = c; break; } }catch (IndexOutOfRangeException e) { break; } } sem.Release(); //Déblocage return(conn); } }
//Fonction permettant de trouver une connexion selon son numéro de connexion public ConnexionTransport this[int numConn] { get { ConnexionTransport conn = null; sem.WaitOne(); //Blocage for (int i = 0; i < listeConnexions.Count; i++) { try{ ConnexionTransport c = listeConnexions[i]; if (c.getNumeroConnexion() == numConn) { conn = c; break; } }catch (IndexOutOfRangeException e) { break; } } sem.Release(); //Déblocage return(conn); } }