/*Permet d'essayer une methode du type 'Paquet XYZ(Paquet)' avec un * nombre d'essaies max de 2. Retourne null si le nombre d'essai max est depasse*/ private Paquet tryWithAcquittementNegatif(Func <Paquet, Paquet> funcToTry, Paquet paquetRecu, ref int triesCount) { //Appel de la function a tester Paquet result = funcToTry(paquetRecu); if ((result.getType() & 0x09) == 0x09) { triesCount++; if (triesCount > 2) { return(null); } //Re-essayer return(tryWithAcquittementNegatif(funcToTry, paquetRecu, ref triesCount)); } else { return(result); } }
private byte?receiveData(Paquet paquetRecu) { Random rnd = new Random(); //Ne retourne rien si l'adresse source est un multiple de 15 if ((paquetRecu.getSrc() % 15) == 0) { writeLog(".....simulation de non reponse....."); Thread.Sleep(1500); //simulation de non-reponse return(null); } //Acquitement négatif else if ((int)((paquetRecu.getType() >> 1) & 0x07) == rnd.Next(0, 7)) { writeLog("paquet de données invalide reçu de " + paquetRecu.getSrc() + "\t\t" + DateTime.Now); return((byte?)((paquetRecu.getType() & 0xE0) | 0x09)); } //Acquitement Positif else { //S'il n'y a qu'une seule trame / dernier paquet if ((paquetRecu.getType() & 0x10) == 0) { trameComplete += (Encoding.ASCII.GetString(paquetRecu.getPaquet(), 2, 128)); //Fin de la trame writeData(trameComplete); trameComplete = ""; writeLog("Paquet de données reçu #" + (paquetRecu.getType() >> 5) + ". Prochain: #" + ((paquetRecu.getType() & 0x0E) >> 1) + ". source: " + paquetRecu.getSrc() + "\t\t" + DateTime.Now); return((byte?)((paquetRecu.getType() & 0xE0) | 0x01)); } //Sinon paquet d'une suite trameComplete += (Encoding.ASCII.GetString(paquetRecu.getPaquet(), 2, 128)); writeLog("Paquet de données reçu #" + (paquetRecu.getType() >> 5) + ". Prochain: #" + ((paquetRecu.getType() & 0x0E) >> 1) + ". source: " + paquetRecu.getSrc() + "\t\t" + DateTime.Now); return((byte?)((paquetRecu.getType() & (0x0E << 4)) | 0x01)); } }
private Paquet liaisonDonnees(Paquet paquetRecu) { int triesCount; switch (paquetRecu.getType()) { case Constantes.N_CONNECT_REQ: triesCount = 0; byte?connexion = tryWithTemp(establishConnexion, paquetRecu, ref triesCount); //Si le distant à refusé la connexion if (connexion == Constantes.N_DISCONNECT_IND) { etat = Constantes.DECONNECTE; writeData("paquet d'indication liberation"); return(new PaquetIndicationLiberation(paquetRecu.getNoConn(), paquetRecu.getSrc(), paquetRecu.getDest(), 0x01)); } //Si le distant a accepté la connexion else if (connexion == Constantes.N_CONNECT_IND) { etat = Constantes.CONNECTE; writeData("paquet de connexion etablie"); return(new PaquetConnexionEtablie(paquetRecu.getNoConn(), paquetRecu.getSrc(), paquetRecu.getDest())); } //Si le distant ne répond pas (connexion = null quand trop long, voir tryWithTemp) else if (connexion == null) { etat = Constantes.DECONNECTE; writeData("paquet d'indication liberation"); return(new PaquetIndicationLiberation(paquetRecu.getNoConn(), paquetRecu.getSrc(), paquetRecu.getDest(), 0x01)); } break; //Pour une demande de déconnexion case Constantes.N_DISCONNECT_REQ: writeLog("Demande de déconnexion Source: " + paquetRecu.getSrc() + "\t\t" + DateTime.Now); writeData("paquet d'indication liberation"); return(new PaquetIndicationLiberation(paquetRecu.getNoConn(), paquetRecu.getSrc(), paquetRecu.getDest(), 0x01)); break; //Data default: byte?retourData = receiveData(paquetRecu); if ((retourData & 0x09) == 0x09) { //Aquittement negatif writeData("paquet d'aqcuittement negatif"); return(new PaquetAcquittementNegatif(paquetRecu.getNoConn(), (byte)(retourData >> 5))); } else if ((retourData & 0x09) == 0x01) { //Acquittement positif writeData("paquet d'aqcuittement positif"); return(new PaquetAcquittement(paquetRecu.getNoConn(), (byte)(retourData >> 5))); } break; } return(null); }