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); } } }
public static String getStringFromPacket(ATMPacket packet) { String bufString = ""; //foreach (ATMPacket p in queue) { bufString = GetStringFromBytes(packet.payload); //} return bufString; }
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); } }
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"); } } }
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))); } } }
//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); } } }
//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))); } } }
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; } } }
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"); } } }