Exemplo n.º 1
0
 public void ATMReader()//wątek obsługujący odczytywanie pakietów z zapytaniami, te z odpowiedziami będą jakoś(jeszcze nie wiem jak) obsługiwane w CzyZyje
 {
     while (true)
     {
         if (kolejkapyt.Count == 0)
         {
             Thread.Sleep(100);
             continue;
         }
         try
         {
             ATMPacket zapytanie, odpowiedz;
             kolejkapyt.TryDequeue(out zapytanie);
             //obsługa pakietu od innego LRMa, w tej metodzie interesują nas tylko wiadomosci z zapytaniem, odpowiedzi obsługiwane są metodą CzyZyje
             //więc jak wykryjemy odp to idzie do drugiej kolejki już na etapie przekazania pakietu przez Nodix
             byte[] payload = ToPayload("ZYJE");
             odpowiedz      = new Packet.ATMPacket(Packet.ATMPacket.AALType.SSM, payload, 0, 0);
             odpowiedz.port = zapytanie.port;
             odpowiedz.VCI  = -1;
             odpowiedz.VPI  = -1;
             parent.packetsToSend.Enqueue(odpowiedz);
         }
         catch (Exception e)
         {
             Console.Out.WriteLine(e.Message);
         }
     }
 }
Exemplo n.º 2
0
 public static String getStringFromPacket(ATMPacket packet)
 {
     String bufString = "";
     //foreach (ATMPacket p in queue) {
     bufString = GetStringFromBytes(packet.payload);
     //}
     return bufString;
 }
Exemplo n.º 3
0
        public void OdczytajATM(Packet.ATMPacket pkt)//każdy pakiet, od razu rozpoznaje rodzaj - czy zapytanie czy odpowiedź, innych nie powinno być, najwyzej przepadną, dodawanie do dobrej kolejki
        {
            String tresc = this.FromPayload(pkt.payload);

            if (tresc.Equals("ZYJESZ?"))
            {
                kolejkapyt.Enqueue(pkt);
            }
            else if (tresc.Equals("ZYJE"))
            {
                kolejkaodp.Add(pkt);
            }
        }
Exemplo n.º 4
0
        private void receiver()
        {
            if (networkStream == null)
            {
                networkStream = new NetworkStream(cloudSocket);

                //tworzy string 'Node ' i tu jego numer
                String welcomeString = "Node " + ((myAddress.subnet * 100) + myAddress.host) + " " + myAddress.ToString();
                //tworzy tablicę bajtów z tego stringa
                byte[] welcomeStringBytes = AAL.GetBytesFromString(welcomeString);
                //wysyła tą tablicę bajtów streamem
                networkStream.Write(welcomeStringBytes, 0, welcomeStringBytes.Length);
            }
            BinaryFormatter bf = new BinaryFormatter();

            try {
                receivedPacket = (Packet.ATMPacket)bf.Deserialize(networkStream);
                if (receivedPacket.VPI == -1 && receivedPacket.VCI == -1)
                {
                    LRM.OdczytajATM(receivedPacket);
                }
                else
                {
                    queuedReceivedPackets.Enqueue(receivedPacket);
                }

                //to może nie działać. Sprawdzi się jeszcze

                /*if (!sendThread.IsAlive) {
                 *  sendThread = new Thread(this.sender);
                 *  sendThread.IsBackground = true;
                 *  sendThread.Start();
                 * }*/
                receiver();
            } catch (Exception e) {
                if (isDisconnect)
                {
                    SetText("Rozłączam się z chmurą!\n"); isDisconnect = false; networkStream = null;
                }
                else
                {
                    SetText("Coś poszło nie tak : " + e.Message + "\n");
                }
            }
        }
Exemplo n.º 5
0
        private void _CzyZyje(Object argg)//pod dany adres (jaqk istnieje) wysyłamy ATMPacket z wiadomością ZYJESZ
        {
            Tuple <Address, int> argus = (Tuple <Address, int>)(argg);
            bool    wolne      = false;
            int     port       = 0;
            Address sprawdzany = argus.Item1;
            int     i2         = argus.Item2;

            //szukanie portu dla adresu
            for (int i = 0; i < parent.routeList.Count; i++)
            {
                if (parent.routeList.ElementAt(i).destAddr.Equals(sprawdzany))//jak adres się zgadza to mamy szukany port do wysyłki
                {
                    port = parent.routeList.ElementAt(i).port;
                    break;
                }
            }
            for (int i = 0; i < parent.routeList.Count; i++)
            {
                if (sprawdzany.Equals(parent.routeList.ElementAt(i).destAddr)) //szukamy na routelist zadanego adresu
                {
                    if (parent.routeList.ElementAt(i).bandwidth >= 2)          //gdy przepustowość co najmniej 2 to ok
                    {
                        wolne = true;
                        break;
                    }
                    else
                    {
                        wolne = false;
                        break;
                    }
                }
            }

            if (port == 0)
            {
                //Wyslij z automatu no, bo nie ma takiego portu, żeby pakiet doszedł na ten adres
                return;
            }
            //wysyłka pakietu na wyszukanym porcie
            {
                String           str     = "ZYJESZ?";/////odpowiedzią na taki paylaod będzie ZYJE :)
                byte[]           payload = ToPayload(str);
                Packet.ATMPacket packiet = new Packet.ATMPacket(Packet.ATMPacket.AALType.SSM, payload, 0, 0);
                packiet.port = port;
                packiet.VCI  = -1;
                packiet.VPI  = -1;
                parent.packetsToSend.Enqueue(packiet);
            }

            //czekanie na odp
            {
                bool      znaleziono   = false;
                Stopwatch t            = new Stopwatch();
                int       maxwaitmilis = 3000; //czekaj do 3 sekund na odpowiedź od sąsiada
                t.Start();
                while (t.ElapsedMilliseconds < maxwaitmilis)
                {
                    //przeszukanie listy pakietów
                    for (int i = 0; i < kolejkaodp.Count; i++)
                    {
                        if (kolejkaodp.ElementAt(i).port == port)
                        {
                            znaleziono = true;
                            kolejkaodp.RemoveAt(i); //usuwam bez dalszego zaglądania, bo jak coś siedzi w tej kolejce to ma w payload ZYJE
                            break;                  //gdy znaleziono to wychodzi z pętli for
                        }
                    }
                    if (znaleziono)
                    {
                        break;//gdy znaleziono to wychodzi z pętli while
                    }
                    Thread.Sleep(100);
                }
                //obsługa rezultatu, jeśli znaleziono to wyślij YES <adres>, jak nie to NO <adres>
                if (znaleziono && wolne)
                {
                    wyslijSPacket(new SPacket(adresLRM, adresRC, ("YES " + sprawdzany.ToString() + " " + i2)));
                }
                else
                {
                    wyslijSPacket(new SPacket(adresLRM, adresRC, ("NO " + sprawdzany.ToString() + " " + i2)));
                }
            }
        }
Exemplo n.º 6
0
 //wątek obsługujący odczytywanie pakietów z zapytaniami, te z odpowiedziami będą jakoś(jeszcze nie wiem jak) obsługiwane w CzyZyje
 public void ATMReader()
 {
     while (true)
     {
         if(kolejkapyt.Count == 0)
         {
             Thread.Sleep(100);
             continue;
         }
         try
         {
             ATMPacket zapytanie, odpowiedz;
             kolejkapyt.TryDequeue(out zapytanie);
             //obsługa pakietu od innego LRMa, w tej metodzie interesują nas tylko wiadomosci z zapytaniem, odpowiedzi obsługiwane są metodą CzyZyje
             //więc jak wykryjemy odp to idzie do drugiej kolejki już na etapie przekazania pakietu przez Nodix
             byte[] payload = ToPayload("ZYJE");
             odpowiedz = new Packet.ATMPacket(Packet.ATMPacket.AALType.SSM, payload, 0, 0);
             odpowiedz.port = zapytanie.port;
             odpowiedz.VCI = -1;
             odpowiedz.VPI = -1;
             parent.queuedReceivedPackets.Enqueue(odpowiedz);
         }
         catch(Exception e)
         {
             Console.Out.WriteLine(e.Message);
         }
     }
 }
Exemplo n.º 7
0
        //pod dany adres (jaqk istnieje) wysyłamy ATMPacket z wiadomością ZYJESZ
        private void _CzyZyje(Object argg)
        {
            Tuple<Address, int> argus = (Tuple<Address, int>)argg;
            bool wolne = false;
            int port=0;
            Address sprawdzany = argus.Item1;
            int i2 = argus.Item2;

            //szukanie portu dla adresu
            for (int i = 0; i < parent.routeList.Count; i++ )
            {
                if(parent.routeList.ElementAt(i).destAddr.Equals(sprawdzany))//jak adres się zgadza to mamy szukany port do wysyłki
                {
                    port = parent.routeList.ElementAt(i).port;
                    break;
                }
            }
            for (int i = 0; i < parent.routeList.Count; i++)
            {
                if (sprawdzany.Equals(parent.routeList.ElementAt(i).destAddr))//szukamy na routelist zadanego adresu
                {
                    if (parent.routeList.ElementAt(i).bandwidth >= 2)//gdy przepustowość co najmniej 2 to ok
                    {
                        wolne = true;
                        break;
                    }
                    else
                    {
                        wolne = false;
                        break;
                    }
                }
            }

            if(port==0)
            {
                //Wyslij z automatu no, bo nie ma takiego portu, żeby pakiet doszedł na ten adres
                return;
            }
            //wysyłka pakietu na wyszukanym porcie
            {
                String str = "ZYJESZ?";/////odpowiedzią na taki paylaod będzie ZYJE :)
                byte[] payload = ToPayload(str);
                Packet.ATMPacket packiet = new Packet.ATMPacket(Packet.ATMPacket.AALType.SSM, payload, 0, 0);
                packiet.port = port;
                packiet.VCI = -1;
                packiet.VPI = -1;
                parent.queuedReceivedPackets.Enqueue(packiet);
            }

            //czekanie na odp
            {
                bool znaleziono=false;
                Stopwatch t = new Stopwatch();
                int maxwaitmilis = 3000; //czekaj do 3 sekund na odpowiedź od sąsiada
                t.Start();
                while (t.ElapsedMilliseconds < maxwaitmilis)
                {
                    //przeszukanie listy pakietów
                    for(int i=0;i<kolejkaodp.Count;i++)
                    {
                        if(kolejkaodp.ElementAt(i).port==port)
                        {
                            znaleziono = true;
                            kolejkaodp.RemoveAt(i);//usuwam bez dalszego zaglądania, bo jak coś siedzi w tej kolejce to ma w payload ZYJE
                            break;//gdy znaleziono to wychodzi z pętli for
                        }

                    }
                    if(znaleziono)
                    {
                        break;//gdy znaleziono to wychodzi z pętli while
                    }
                    Thread.Sleep(100);
                }
                //obsługa rezultatu, jeśli znaleziono to wyślij YES <adres>, jak nie to NO <adres>
                if(znaleziono && wolne)
                {
                    wyslijSPacket(new SPacket(adresLRM, adresRC, ("YES " + sprawdzany.ToString() + " " + i2)));
                }
                else
                {
                    wyslijSPacket(new SPacket(adresLRM, adresRC, ("NO " + sprawdzany.ToString() + " " + i2)));
                }

            }
        }
Exemplo n.º 8
0
        private void receiver()
        {
            try {
                if (networkStream == null) {
                    networkStream = new NetworkStream(cloudSocket);
                    //tworzy string 'client ' i tu jego nazwę
                    String welcomeString = "Client " + username + " " + myAddress.ToString();
                    //tworzy tablicę bajtów z tego stringa
                    byte[] welcomeStringBytes = AAL.GetBytesFromString(welcomeString);
                    //wysyła tą tablicę bajtów streamem
                    networkStream.Write(welcomeStringBytes, 0, welcomeStringBytes.Length);
                }
                BinaryFormatter bf = new BinaryFormatter();
                receivedPacket = (Packet.ATMPacket)bf.Deserialize(networkStream);
                int tempSeq = 0;

                PortVPIVCI temp = new PortVPIVCI(receivedPacket.port, receivedPacket.VPI, receivedPacket.VCI);
                String tempName = "";
                bool isNameFound = false;
                foreach (String name in VCArray.Keys) {
                    List<PortVPIVCI> t = new List<PortVPIVCI>();
                    VCArray.TryGetValue(name, out t);
                    if (t.Contains(temp)) {
                        tempName = name;
                        isNameFound = true;
                    }
                }
                foreach (String name in NEWVCARRAY.Keys) {
                    List<PortVPIVCI> t = new List<PortVPIVCI>();
                    NEWVCARRAY.TryGetValue(name, out t);
                    if (t.Contains(temp)) {
                        tempName = name;
                        isNameFound = true;
                    }
                }
                if (receivedPacket.VCI == -1 && receivedPacket.VPI == -1) {
                    LRM.OdczytajATM(receivedPacket);
                } else {
                    /*
                    if (isNameFound) {
                        SetText(tempName+ " :  ");
                    } else SetText("[" + receivedPacket.port + ";" + receivedPacket.VPI + ";" + receivedPacket.VCI + "] : ");
                    */
                    // gdy wiadomość zawarta jest w jednym pakiecie
                    if (receivedPacket.PacketType == Packet.ATMPacket.AALType.SSM) {
                        if (isNameFound) {
                            SetText(tempName + " :  ");
                        } else SetText("[" + receivedPacket.port + ";" + receivedPacket.VPI + ";" + receivedPacket.VCI + "] : ");
                        SetText(Packet.AAL.getStringFromPacket(receivedPacket) + "\n");
                        tempMid = 0;
                    } else if (receivedPacket.PacketType == Packet.ATMPacket.AALType.BOM) {
                        if (isNameFound) {
                            SetText(tempName + " :  ");
                        } else SetText("[" + receivedPacket.port + ";" + receivedPacket.VPI + ";" + receivedPacket.VCI + "] : ");
                        tempSeq = 0;
                        tempMid = receivedPacket.AALMid;
                        SetText(Packet.AAL.getStringFromPacket(receivedPacket));
                        /*
                        queuedReceivedPackets.Clear();
                        queuedReceivedPackets.Enqueue(receivedPacket);
                        */
                    } else if (receivedPacket.PacketType == Packet.ATMPacket.AALType.COM) {
                        if (receivedPacket.AALMid == tempMid) {
                            //sprawdza kolejnosc AALSeq

                            //usun tempmid
                            if (receivedPacket.AALSeq == ++tempSeq) {
                                SetText(Packet.AAL.getStringFromPacket(receivedPacket));
                                //queuedReceivedPackets.Enqueue(receivedPacket);
                            } else {
                                //SetText("\nPakiet ma inny AALSeq niż powinien mieć, pakiety przyszły w innej kolejności!\n");
                                SetText(Packet.AAL.getStringFromPacket(receivedPacket));
                            }
                        } else {
                            //SetText("\nPakiet z innej wiadomości! Inne AALMid!\n");
                            SetText("\n" + tempName + " : " + Packet.AAL.getStringFromPacket(receivedPacket));
                        }
                    } else if (receivedPacket.PacketType == Packet.ATMPacket.AALType.EOM) {
                        /*
                        queuedReceivedPackets.Enqueue(receivedPacket);
                        SetText(Packet.AAL.getStringFromPackets(queuedReceivedPackets));
                        queuedReceivedPackets.Clear();
                         */
                        SetText(Packet.AAL.getStringFromPacket(receivedPacket) + "\n");
                        tempSeq = 0;
                        tempMid = 0;
                    }
                }
                //networkStream.Close();
                Thread.Sleep(100);
                receiver();
            } catch (Exception e){
                if (isDisconnect) {
                    SetText("Rozłączam się z chmurą!\n"); isDisconnect = false; networkStream = null;
                } else {
                    SetText("Coś poszło nie tak : " + e.Message + "\n");
                    cloudSocket = null;
                    cloudEndPoint = null;
                    networkStream = null;
                    isConnectedToCloud = false;
                }
            }
        }
Exemplo n.º 9
0
        private void receiver()
        {
            if (networkStream == null) {
                networkStream = new NetworkStream(cloudSocket);

                //tworzy string 'Node ' i tu jego numer
                String welcomeString = "Node " + ((myAddress.subnet*100)+myAddress.host) + " " + myAddress.ToString();
                //tworzy tablicę bajtów z tego stringa
                byte[] welcomeStringBytes = AAL.GetBytesFromString(welcomeString);
                //wysyła tą tablicę bajtów streamem
                networkStream.Write(welcomeStringBytes, 0, welcomeStringBytes.Length);
            }
            BinaryFormatter bf = new BinaryFormatter();
            try {
                receivedPacket = (Packet.ATMPacket)bf.Deserialize(networkStream);
                if (receivedPacket.VPI == -1 && receivedPacket.VCI == -1) {
                    LRM.OdczytajATM(receivedPacket);
                }
                else queuedReceivedPackets.Enqueue(receivedPacket);

                //to może nie działać. Sprawdzi się jeszcze
                /*if (!sendThread.IsAlive) {
                    sendThread = new Thread(this.sender);
                    sendThread.IsBackground = true;
                    sendThread.Start();
                }*/
                    receiver();
            } catch (Exception e) {
                if (isDisconnect) { SetText("Rozłączam się z chmurą!\n"); isDisconnect = false; networkStream = null; }
                else { SetText("Coś poszło nie tak : " + e.Message + "\n"); }
            }
        }