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 byte?establishConnexion(Paquet paquetRecu)
        {
            //writeData("tentative de connexion Source: " + ((int)paquetRecu.getSrc()).ToString() + ", Destination: " + ((int)paquetRecu.getDest()).ToString() + "\t\t" + DateTime.Now);
            //Pas de réponse
            if ((int)paquetRecu.getSrc() % 19 == 0)
            {
                writeLog(".....simulation de non reponse.....");

                Thread.Sleep(1500); //simulation de non-reponse
                return(null);
            }
            //Connexion refusée
            else if ((int)paquetRecu.getSrc() % 13 == 0)
            {
                writeLog("Connexion refusée " + DateTime.Now);
                return(Constantes.N_DISCONNECT_IND);
            }
            //Connexion établie
            else
            {
                writeLog("Connexion établie " + DateTime.Now);
                return(Constantes.N_CONNECT_IND);
            }
        }
        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);
        }