private void InitializeSocket() { try { //tworzymy gniazdo i przypisujemy mu numer portu i IP zgodne z plikiem konfig _pcSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _pcIpEndPoint = new IPEndPoint((IPAddress.Parse(_pcIpAddress)), _pcPort); _pcSocket.Bind(_pcIpEndPoint); } catch { //LOG SignallingNodeDeviceClass.MakeSignallingLog("PC", "ERROR - Incorrect IP address or port number or these values are already in use."); //_cloud.StopWorking("Incorrect IP address or port number or these values are already in use."); } //LOG SignallingNodeDeviceClass.MakeSignallingLog("PC", "INFO - PC Socket: IP:" + _pcIpAddress + " Port:" + _pcPort); //tworzymy punkt końcowy, z którego będziemy odbierali dane (z jakiegokolwiek adresu IP na porcie sygnalizacyjnym _pcPort) _receivingIPEndPoint = new IPEndPoint(IPAddress.Any, _pcPort); _receivingEndPoint = (EndPoint)_receivingIPEndPoint; //tworzymy bufor nasłuchujący _buffer = new byte[_pcSocket.ReceiveBufferSize]; //nasłuchujemy _pcSocket.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref _receivingEndPoint, new AsyncCallback(ReceivedPacketCallback), null); //LOG SignallingNodeDeviceClass.MakeSignallingLog("PC", "INFO - Start Listening."); }
private void ReceiveInsideMessage(SignalMessage message) { Delegate_ReceiveInsideMessage receiveMessage = null; switch (message.General_DestinationModule) { case "CC": receiveMessage = new Delegate_ReceiveInsideMessage(_moduleCC.ReceiveMessageFromPC); break; case "RC": receiveMessage = new Delegate_ReceiveInsideMessage(_moduleRC.ReceiveMessageFromPC); break; case "LRM": receiveMessage = new Delegate_ReceiveInsideMessage(_moduleLRM.ReceiveMessageFromPC); break; default: SignallingNodeDeviceClass.MakeSignallingLog("PC", "ERROR - Destination module unknown."); break; } if (receiveMessage != null) { receiveMessage.BeginInvoke(message, new AsyncCallback(ReceiveInsideMessageCallback), null); } }
private void SendPacketCallback(IAsyncResult res) { var endPoint = res.AsyncState as IPEndPoint; //tworzę logi SignallingNodeDeviceClass.MakeSignallingLog("PC", "INFO - Packet send to: IP:" + endPoint.Address + " Port: " + endPoint.Port); int size = _pcSocket.EndSendTo(res); }
private static void ReceiveInsideMessageCallback(IAsyncResult async) { SignallingNodeDeviceClass.MakeSignallingLog("PC", "INFO - Received inside message"); //metoda wywoływana po wyjściu z metody ReceiveInsideMessage AsyncResult ar = (AsyncResult)async; Delegate_ReceiveInsideMessage del = (Delegate_ReceiveInsideMessage)ar.AsyncDelegate; del.EndInvoke(async); }
private void ReceivedPacketCallback(IAsyncResult res) { Console.WriteLine("cos przyszlo"); int size; try { //kończę odbieranie danych size = _pcSocket.EndReceiveFrom(res, ref _receivingEndPoint); } catch { IPEndPoint unreachableHost = _receivingEndPoint as IPEndPoint; SignallingNodeDeviceClass.MakeSignallingLog("PC", "ERROR - Cannnot send packet to: IP:" + unreachableHost.Address + " Port: " + unreachableHost.Port + ". Destination unreachable (Port unreachable)"); //ustawiam odpowiedni recivingEndPoint _receivingIPEndPoint = new IPEndPoint(IPAddress.Any, _pcPort); _receivingEndPoint = (EndPoint)_receivingIPEndPoint; //tworzymy bufor nasłuchujący _buffer = new byte[_pcSocket.ReceiveBufferSize]; //uruchamiam ponowne nasłuchiwanie _pcSocket.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref _receivingEndPoint, new AsyncCallback(ReceivedPacketCallback), null); return; } //tworzę tablicę bajtów składającą się jedynie z danych otrzymanych (otrzymany pakiet) byte[] receivedPacket = new byte[size]; Array.Copy(_buffer, receivedPacket, receivedPacket.Length); //tworzę tymczasowy LOKALNY punkt końcowy zawierający informacje o nadawcy (jego ip oraz nr portu) IPEndPoint _receivedIPEndPoint = (IPEndPoint)_receivingEndPoint; //zeruje bufor odbierający _buffer = new byte[_pcSocket.ReceiveBufferSize]; //ustawiam odpowiedni recivingEndPoint _receivingIPEndPoint = new IPEndPoint(IPAddress.Any, _pcPort); _receivingEndPoint = (EndPoint)_receivingIPEndPoint; //tworzę logi SignallingNodeDeviceClass.MakeSignallingLog("PC", "INFO - Received packet from: IP:" + _receivedIPEndPoint.Address + " Port: " + _receivedIPEndPoint.Port); //uruchamiam ponowne nasłuchiwanie _pcSocket.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref _receivingEndPoint, new AsyncCallback(ReceivedPacketCallback), null); //przesyłam otrzymaną wiadomość do metody odpowiedzialnej za przetwarzanie ReceiveOutsidePacket(receivedPacket); }
public static void Serialization(string configFilePath, RC_XmlSchame dataSource) { XmlSerializer serializer = new XmlSerializer(typeof(RC_XmlSchame)); try { using (TextWriter writer = new StreamWriter(configFilePath, false)) { serializer.Serialize(writer, dataSource); } } catch (Exception e) { SignallingNodeDeviceClass.MakeSignallingLog("RC", "ERROR - Serialization cannot be complited."); } }
public static RC_XmlSchame Deserialization(string configFilePath) { object obj = new object(); XmlSerializer deserializer = new XmlSerializer(typeof(RC_XmlSchame)); try { using (TextReader reader = new StreamReader(configFilePath)) { obj = deserializer.Deserialize(reader); } return(obj as RC_XmlSchame); } catch (Exception e) { SignallingNodeDeviceClass.MakeSignallingLog("RC", "ERROR - Deserialization cannot be complited."); return(null); } }
private int GetNextFreeLabel(SNPP first, SNPP second, int index_in_list) { bool sendRejectedResponse = false; //sprawdzamy, czy wgl jest jakas wolna lambda if (first._availableLabels.Count == 0) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - No free label available in SNPP with id " + first._localID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - No free label available in SNPP with id " + first._localID); sendRejectedResponse = true; } else if (second._availableLabels.Count == 0) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - No free label available in SNPP with id " + second._localID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - No free label available in SNPP with id " + second._localID); sendRejectedResponse = true; } if (sendRejectedResponse) { return(-1); } else { if (first._availableLabels.Count < index_in_list) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - No more free label available in SNPP with id " + first._localID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - No more free label available in SNPP with id " + first._localID); return(-1); } else { return(first._availableLabels[index_in_list]); } } }
private void SendMessageToPC(SignalMessage message) { _pc.SendSignallingMessage(message); SignallingNodeDeviceClass.MakeSignallingLog("LRM", "INFO - Signalling message send to PC module"); }
private void LinkConnectionResponse(int connectionID, bool isAccepted, List <SNP> receivedSnps, List <string> receivedSnpsAreaNames) { //wyszukujemy wskaźnik na odpowiednią tablicę ConnectionTableRecord record = _connectionsList[_indexInListOfConnection[connectionID]]; //zwiększ liczbę otrzymanych wiadomości record.NumberOfResponse++; #region Step_1-Sprawdz_status_odpowiedzi if (isAccepted) { //odpowiedź jest pozytywna - udało się zaalokować łącze //uzupełniam odpowiednie listy danymi zawartymi w odpowiedzi for (int i = 0; i < receivedSnpsAreaNames.Count; i++) { int index = record.AllocatedSnpAreaName.IndexOf(receivedSnpsAreaNames[i]); record.AllocatedSnps[index].Add(receivedSnps[i]); } } else { //odpowiedź jest negatywna - nie udało się zaalowkować łącza SignallingNodeDeviceClass.MakeSignallingLog("CC", "ERROR - LinkConnectionRequest is not accepted"); SignallingNodeDeviceClass.MakeSignallingConsoleLog("CC", "ERROR - LinkConnectionRequest is not accepted"); //dopisać kod, który wykonuje sie w sytuacji odmowy alokacji return; } #endregion #region Step_2-Sprawdź_czy_odebrałem_wszystkie_odpowiedzi_czy_mam_czekac_dalej if (record.NumberOfResponse == record.NumberOfRequest) { //otrzymałem wszystkie odpowiedzi //ustaw nowy status rekordu oznaczający, że wszystkie lokalne linki zostały ustawione record.Status = "localLinksAllocated"; //sprawdź, czy nasze połaczenie przechodzi przez jakieś podsieci if (record.AllocatedSnpAreaName.Count > 1) //zawsze będzie nasza podsieć { //ustaw nowe wartości Response i Request record.NumberOfRequest = record.AllocatedSnpAreaName.Count - 1; record.NumberOfResponse = 0; //wyślij do każdego areaName != localAreaName wiadomosć ConnectionRequest //pierwszy wiersz dotyczy lokalnej sytuacji więc go omijamy for (int i = 1; i < record.NumberOfRequest + 1; i++) { SNP snpIn = record.AllocatedSnps[i][0]; SNP snpOut = record.AllocatedSnps[i][1]; //znajdź adres docelowy PC obsługującego CC niższego rzędu związanego z daną areaname string destinationIpAddress = _connectedCcDestinationAddrress[record.AllocatedSnpAreaName[i]]; //wyślij do CC niższego rzędu wiadomośc connectionRequest ConnectionRequest(connectionID, snpIn, snpOut, record.AllocatedCapacity, destinationIpAddress); } } else { //jak nie ma już żadnej podsieci to znaczy, że zakończyliśmy działania tego CC i wysyłamy ConnectionResponse do CC wyższego //znajdź adres docelowy PC obsługującego CC wyższego rzędu związanego z daną areaname string destinationIpAddress = _connectedCcDestinationAddrress[_higherAreaName]; ConnectionResponse(connectionID, true, destinationIpAddress); //zmień status na established record.Status = "established"; } } else { //nie otrzymałem wszystkich więc czekam na pozostałe return; } #endregion //if (record.IsInterdomain && record.Status == "establishingInterdomainLink") //{ // //Wyslij do RC pierwsza parę złożoną ze zmiennych boudaryFirst boundarySecond znajdującej się w rekordzie // SignalMessage message = new SignalMessage() // { // General_SignalMessageType = SignalMessage.SignalType.RouteQuery, // General_SourceIpAddress = _localPcIpAddress, // General_DestinationIpAddress = _localPcIpAddress, // General_SourceModule = "CC", // General_DestinationModule = "RC", // ConnnectionID = record.ConnectionID, // SnppIdPair = new SignalMessage.Pair // { // first = record.LocalBoundaryFirstSnppID, // second = record.LocalBoundarySecondSnppID // }, // CallingCapacity = record.AllocatedCapacity // }; //} //else //{ // //ustaw nowy status rekordu oznaczający, że wszystkie lokalne linki zostały ustawione // record.Status = "localLinksAllocated"; // //sprawdź, czy nasze połaczenie przechodzi przez jakieś podsieci // if (record.AllocatedSnpAreaName.Count > 1) //zawsze będzie nasza podsieć // { // //zaalokuj nowe listy // record.NumberOfCcConnectionRequestToSend = record.AllocatedSnpAreaName.Count; // int // //tworzę listę odpowiedzi // record.IsConnectionResponse = new List<bool>(listCount); // record.ConnectionResponseStatus = new List<bool>(listCount); // //wyślij do każdego areaName != localAreaName wiadomosć ConnectionRequest // //pierwszy wiersz dotyczy lokalnej sytuacji więc go omijamy // for (int i = 1; i < listCount; i++) // { // SNP snpIn = record.AllocatedSnps[i][0]; // SNP snpOut = record.AllocatedSnps[i][1]; // ConnectionRequest(connectionID, snpIn, snpOut); // } // } // else // { // //jak nie ma już żadnej podsieci to znaczy, że zakończyliśmy działania tego CC i wysyłamy ConnectionResponse // ConnectionResponse(connectionID, true); // //zmień status na established // record.Status = "established"; // } //} //#endregion }
private void SNPRealise(int dealocationID, int snppID, int connectionID, string sourcePcIpAddress) { #region Odszukuje_obiekt_SNPP_o_zadanym_id SNPP requestedSnpp = null; for (int i = 0; i < _snppList.Count; i++) { if (_snppList[i]._localID == snppID) { requestedSnpp = _snppList[i]; break; } } //jeżeli nie ma takiego obiektu to zwróć błąd if (requestedSnpp == null) { //jest jakiś błąd i trzeba to zakomunikować SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR (SnppRealise)- Cannot find the SNPP with ID equals " + snppID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR (SnppRealise)- Cannot find the SNPP with ID equals " + snppID); //zwróć odpowiedź negatywną SignalMessage rejectedMessage = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPRealiseResponse, General_DestinationIpAddress = sourcePcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = dealocationID, IsAccepted = false }; //wyslij wiadomość i wyjdź z metody SendMessageToPC(rejectedMessage); return; } #endregion #region Znajduję_SNP_związane_z_connectionID SNP localSNP = null; for (int i = 0; i < requestedSnpp._allocatedSNP.Count; i++) { if (requestedSnpp._allocatedSNP[i]._connectionID == connectionID) { localSNP = requestedSnpp._allocatedSNP[i]; break; } } //jeżeli nie ma to zwróc negatywną odpowiedź if (localSNP == null) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - Cannot find the SNP with connectionID equals " + connectionID + " in SNPP with ID: " + requestedSnpp._localID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - Cannot find the SNP with connectionID equals " + connectionID + " in SNPP with ID: " + requestedSnpp._localID); //wyślij wiadomość odmowną SignalMessage message = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPRealiseResponse, General_DestinationIpAddress = sourcePcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = dealocationID, IsAccepted = false }; SendMessageToPC(message); //zakończ działanie metody return; } #endregion #region Zwolnij_etykiete_i_usun_localSNP int freeLabel = localSNP._allocatedLabel; requestedSnpp._availableLabels.Add(freeLabel); requestedSnpp._allocatedSNP.Remove(localSNP); #endregion #region Wyslij_odpowiedź SignalMessage acceptedMessage = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPRealiseResponse, General_DestinationIpAddress = sourcePcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = dealocationID, IsAccepted = true }; SendMessageToPC(acceptedMessage); #endregion }
private void SNPNegotiation_Analyse(int negotiationID, int connectionID, int label, int snppID, int connectionCapacity, string sourcePcIpAddress) { #region Odszukuje_obiekt_SNPP_o_zadanym_id SNPP requestedSnpp = null; for (int i = 0; i < _snppList.Count; i++) { if (_snppList[i]._localID == snppID) { requestedSnpp = _snppList[i]; break; } } //jeżeli nie ma takiego obiektu to zwróć błąd if (requestedSnpp == null) { //jest jakiś błąd i trzeba to zakomunikować SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR (SnppNegotiation)- Cannot find the SNPP with ID equals " + snppID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR (SnppNegotiation)- Cannot find the SNPP with ID equals " + snppID); //zwróć odpowiedź negatywną SignalMessage rejectedMessage = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPNegotiationResponse, General_DestinationIpAddress = sourcePcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = negotiationID, IsAccepted = false }; //wyslij wiadomość i wyjdź z metody SendMessageToPC(rejectedMessage); return; } #endregion #region Sprawdzam_czy_etykieta_jest_wolna_i_wyslij_odpowiednia_wiadomosc if (requestedSnpp._availableLabels.Contains(label)) { //etykieta jest wolna int index = requestedSnpp._allocatedSNP.Count; SNP allocatedSnp = new SNP { _snpID = index, _snppID = requestedSnpp._localID, _allocatedCapacity = connectionCapacity, _allocatedLabel = label, _connectionID = connectionID }; requestedSnpp._allocatedSNP.Add(allocatedSnp); //wyślij odpowiedź zawierającą zaalokowane SNP SignalMessage accepteddMessage = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPNegotiationResponse, General_DestinationIpAddress = sourcePcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = negotiationID, IsAccepted = true, Negotiation_AllocatedSNP = allocatedSnp }; //wyslij wiadomość i wyjdź z metody SendMessageToPC(accepteddMessage); } else { //etykieta jest zajęta SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR (SnppNegotiation)- Lable already in use: " + label); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR (SnppNegotiation)- Lable already in use: " + label); //zwróć odpowiedź negatywną SignalMessage rejectedMessage = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPNegotiationResponse, General_DestinationIpAddress = sourcePcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = negotiationID, IsAccepted = false }; //wyslij wiadomość i wyjdź z metody SendMessageToPC(rejectedMessage); return; } #endregion }
private void LinkConnectionDealocation(int connectionID, SignalMessage.Pair snpp_id_pair) { #region Odnajdywanie_SNPP_i_sprawdzenie_czy_istnieją //odnajdz pierwszy i drugi SNPP SNPP first = null; SNPP second = null; //wyszukuje pierwszą wartość w liście for (int i = 0; i < _snppList.Count; i++) { if (_snppList[i]._localID == snpp_id_pair.first) { first = _snppList[i]; break; } } //jeżeli nie ma takiego elementu to zwróć bład if (first == null) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); } else { //wyszukuje drugą wartość w liście for (int i = 0; i < _snppList.Count; i++) { if (_snppList[i]._localID == snpp_id_pair.second) { second = _snppList[i]; break; } } //jeżeli nie ma takiego elementu to zwróć bład if (second == null) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); } } if (first == null || second == null) { SignalMessage rejectedResponse = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.LinkConnectionDealocationResponse, General_DestinationIpAddress = _localPcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "CC", IsAccepted = false, }; SendMessageToPC(rejectedResponse); //zakończ działanie metody return; } #endregion #region Znajdź_SNP_związane_z_tym_connectionID SNP localSNP = null; for (int i = 0; i < first._allocatedSNP.Count; i++) { if (first._allocatedSNP[i]._connectionID == connectionID) { localSNP = first._allocatedSNP[i]; break; } } if (localSNP == null) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - Cannot find the SNP with connectionID equals " + snpp_id_pair.first + " in SNPP with ID: " + first._localID); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - Cannot find the SNP with connectionID equals " + snpp_id_pair.first + " in SNPP with ID: " + first._localID); //wyślij wiadomość odmowną SignalMessage rejectedResponse = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.LinkConnectionDealocationResponse, General_DestinationIpAddress = _localPcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "CC", IsAccepted = false }; SendMessageToPC(rejectedResponse); //zakończ działanie metody return; } #endregion #region Wyslij_lokalne_i_zewnętrzne_snpRealise_i_czekaj_na_odp bool accept = false; List <int> dealocationIDList = new List <int>(); Random rnd = new Random(); while (!accept) { //losuje identyfikator negocjacji dealocationIDList.Add(rnd.Next()); while (_isSnpRealiseAnswerBack.ContainsKey(dealocationIDList[0])) { dealocationIDList[0] = rnd.Next(); } //utwórz wpis w słowniku z danym ID _isSnpRealiseAnswerBack.Add(dealocationIDList[0], false); //wysyłamy SNPRealise do lokalnego LRM SignalMessage snmInsideNegotiation = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPRealise, General_DestinationIpAddress = _localPcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = dealocationIDList[0], Negotiation_SnppID = second._localID, Negotiation_ConnectionID = connectionID }; SendMessageToPC(snmInsideNegotiation); //wysyłamy SNPRealise do pozostałych podsieci jeżeli jest taka konieczność if (first._areaName != _areaName) { dealocationIDList.Add(rnd.Next()); while (_isSnpRealiseAnswerBack.ContainsKey(dealocationIDList[dealocationIDList.Count - 1])) { dealocationIDList[dealocationIDList.Count - 1] = rnd.Next(); } //utwórz wpisy w słownikach _isSnpRealiseAnswerBack.Add(dealocationIDList[dealocationIDList.Count - 1], false); //znajdź adres PC odpowiedzialnego za dany LRM w sieci first._areaName string destinationIpAddr = _lrmToSubnetworksDictionary[first._areaName]; SignalMessage message = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPRealise, General_SourceIpAddress = _localPcIpAddress, General_DestinationIpAddress = destinationIpAddr, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = dealocationIDList[dealocationIDList.Count - 1], Negotiation_SnppID = first._areaNameSnppID, Negotiation_ConnectionID = connectionID }; SendMessageToPC(message); } if (second._areaName != _areaName) { dealocationIDList.Add(rnd.Next()); while (_isSnpRealiseAnswerBack.ContainsKey(dealocationIDList[dealocationIDList.Count - 1])) { dealocationIDList[dealocationIDList.Count - 1] = rnd.Next(); } //utwórz wpisy w słownikach _isSnpRealiseAnswerBack.Add(dealocationIDList[dealocationIDList.Count - 1], false); //znajdź adres PC odpowiedzialnego za dany LRM w sieci first._areaName string destinationIpAddr = _lrmToSubnetworksDictionary[second._areaName]; SignalMessage message = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.SNPRealise, General_SourceIpAddress = _localPcIpAddress, General_DestinationIpAddress = destinationIpAddr, General_SourceModule = "LRM", General_DestinationModule = "LRM", Negotiation_ID = dealocationIDList[dealocationIDList.Count - 1], Negotiation_SnppID = second._areaNameSnppID, Negotiation_ConnectionID = connectionID }; SendMessageToPC(message); } //czekamy biernie na odpowiedzi wszystkie (min 1 max 3) int waitingAnswerstToGet = dealocationIDList.Count; while (waitingAnswerstToGet != 0) { for (int i = 0; i < dealocationIDList.Count; i++) { if (_isSnpRealiseAnswerBack[(dealocationIDList[i])] == true) { waitingAnswerstToGet--; } } } //sprawdzamy, czy wszystkie odpowiedzi były prawidłowe int numberOfAcceptAnswers = 0; for (int i = 0; i < dealocationIDList.Count; i++) { if (_snpRealiseAnswerBack[dealocationIDList[i]] == true) { numberOfAcceptAnswers++; } } if (numberOfAcceptAnswers == dealocationIDList.Count) { accept = true; } else { accept = false; //tutaj trzeba namierzyć tą która jest zła i wysłać Realise i ponownie spróbować losować jakąć czy coś } }//end while(!accept) #endregion #region Zwalnianie_etykiety_i_usuwanie_localSNP //zwalnianie etykiety int freeLabel = localSNP._allocatedLabel; first._availableLabels.Add(freeLabel); //usuwanie local SNP first._allocatedSNP.Remove(localSNP); #endregion #region Wysyłanie_wiadomości_wstecznej SignalMessage acceptedMessage = new SignalMessage() { General_SignalMessageType = SignalMessage.SignalType.LinkConnectionDealocationResponse, General_DestinationIpAddress = _localPcIpAddress, General_SourceIpAddress = _localPcIpAddress, General_SourceModule = "LRM", General_DestinationModule = "CC", IsAccepted = true, }; SendMessageToPC(acceptedMessage); #endregion }
private void LinkConnectionRequest(int connectionID, SignalMessage.Pair snpp_id_pair, int connectionCapacity) //DOKOŃCZYC { #region Odnajdywanie_SNPP_i_sprawdzenie_czy_istnieją //odnajdz pierwszy i drugi SNPP SNPP first = null; SNPP second = null; //wyszukuje pierwszą wartość w liście for (int i = 0; i < _snppList.Count; i++) { if (_snppList[i]._localID == snpp_id_pair.first) { first = _snppList[i]; break; } } //jeżeli nie ma takiego elementu to zwróć bład if (first == null) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); } else { //wyszukuje drugą wartość w liście for (int i = 0; i < _snppList.Count; i++) { if (_snppList[i]._localID == snpp_id_pair.second) { second = _snppList[i]; break; } } //jeżeli nie ma takiego elementu to zwróć bład if (second == null) { SignallingNodeDeviceClass.MakeSignallingLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); SignallingNodeDeviceClass.MakeSignallingConsoleLog("LRM", "ERROR - Cannot find the SNPP with ID equals " + snpp_id_pair.first); } } if (first == null || second == null) { //wyślij wiadomośc negatywną LinkConnectionResponse(connectionID, false, null, null); //zakończ działanie metody return; } #endregion #region Sprawdzenie_czy_nie_ma_jakiegos_SNP_zwiazanego_z_tym_connectionID //Sprawdz, czy nie ma jakiegoś SNP związanego z tym connectionID int labelToForward = -1; for (int i = 0; i < first._allocatedSNP.Count; i++) { if (first._allocatedSNP[i]._connectionID == connectionID) { labelToForward = first._allocatedSNP[i]._allocatedLabel; break; } } // Jeżeli nie ma, to sprawdz w drugim if (labelToForward == -1) { for (int i = 0; i < second._allocatedSNP.Count; i++) { if (second._allocatedSNP[i]._connectionID == connectionID) { labelToForward = second._allocatedSNP[i]._allocatedLabel; break; } } } #endregion #region Ewentualne_losowanie_i_negocjacja_wybranej_etykiety int numberOfIterations = 0; bool accept = false; List <int> negotiationIDList = new List <int>(); Random rnd = new Random(); while (!accept) { numberOfIterations++; if (labelToForward == -1) { labelToForward = GetNextFreeLabel(first, second, numberOfIterations - 1); } if (labelToForward == -1) { //wyślij wiadomośc negatywną LinkConnectionResponse(connectionID, false, null, null); } else { //losuje identyfikator negocjacji negotiationIDList.Add(rnd.Next()); while (_isSnpNegotiationAnswerBack.ContainsKey(negotiationIDList[0])) { negotiationIDList[0] = rnd.Next(); } _isSnpNegotiationAnswerBack.Add(negotiationIDList[0], false); _snpNegotiatinAnswerBackAreaName.Add(negotiationIDList[0], _areaName); //wysyłamy SNMNegotiation do lokalnego LRM SNPNegotiation(negotiationIDList[0], connectionID, labelToForward, second._localID, connectionCapacity); //wysyłamy SNMNegotiation do pozostałych podsieci jeżeli jest taka konieczność if (first._areaName != _areaName) { negotiationIDList.Add(rnd.Next()); while (_isSnpNegotiationAnswerBack.ContainsKey(negotiationIDList[negotiationIDList.Count - 1])) { negotiationIDList[negotiationIDList.Count - 1] = rnd.Next(); } //utwórz wpisy w słownikach _isSnpNegotiationAnswerBack.Add(negotiationIDList[negotiationIDList.Count - 1], false); _snpNegotiatinAnswerBackAreaName.Add(negotiationIDList[negotiationIDList.Count - 1], first._areaName); //znajdź adres PC odpowiedzialnego za dany LRM w sieci first._areaName string destinationIpAddr = _lrmToSubnetworksDictionary[first._areaName]; //wyslij wiadomość SNPNegotiation( negotiationIDList[negotiationIDList.Count - 1], connectionID, labelToForward, first._areaNameSnppID, connectionCapacity, destinationIpAddr); } if (second._areaName != _areaName) { negotiationIDList.Add(rnd.Next()); while (_isSnpNegotiationAnswerBack.ContainsKey(negotiationIDList[negotiationIDList.Count - 1])) { negotiationIDList[negotiationIDList.Count - 1] = rnd.Next(); } //utwórz wpisy w słownikach _isSnpNegotiationAnswerBack.Add(negotiationIDList[negotiationIDList.Count - 1], false); _snpNegotiatinAnswerBackAreaName.Add(negotiationIDList[negotiationIDList.Count - 1], second._areaName); //znajdź adres PC odpowiedzialnego za dany LRM w sieci second._areaName string destinationIpAddr = _lrmToSubnetworksDictionary[second._areaName]; //wyslij wiadomość SNPNegotiation( negotiationIDList[negotiationIDList.Count - 1], connectionID, labelToForward, second._areaNameSnppID, connectionCapacity, destinationIpAddr); } //czekamy biernie na odpowiedzi wszystkie (min 1 max 3) int waitingAnswerstToGet = negotiationIDList.Count; while (waitingAnswerstToGet != 0) { for (int i = 0; i < negotiationIDList.Count; i++) { if (_isSnpNegotiationAnswerBack[(negotiationIDList[i])] == true) { waitingAnswerstToGet--; } } } //sprawdzamy, czy wszystkie odpowiedzi były prawidłowe int numberOfAcceptAnswers = 0; for (int i = 0; i < negotiationIDList.Count; i++) { if (_snpNegotiationAnswerBack[negotiationIDList[i]].IsAccepted == true) { numberOfAcceptAnswers++; } } if (numberOfAcceptAnswers == negotiationIDList.Count) { accept = true; } else { accept = false; //tutaj trzeba namierzyć tą która jest zła i wysłać Realise i ponownie spróbować losować jakąć czy coś } } } //------------------------------------------------------------------ // alokujemy SNP lokalnie (tylko pierwsza, bo druga mam w odpowiedzi) int firstSnpID = first._allocatedSNP.Count + 1; first._allocatedSNP.Add(new SNP { _snpID = firstSnpID, _snppID = first._localID, _connectionID = connectionID, _allocatedCapacity = connectionCapacity, _allocatedLabel = labelToForward }); //------------------------------------------------------------------ // tworzymy odpowiedz (odpowiedz skłąda sie z listy SNP zaalokowanych oraz w takiej samej kolejności wypisanych areaName w drugij liscie List <SNP> receivedSnps = new List <SNP>(); List <string> receivedSnpsAreaNames = new List <string>(); //dodaj stwój lokalnie dodany SNP do listy receivedSnps.Add(first._allocatedSNP[firstSnpID]); receivedSnpsAreaNames.Add(_areaName); //dodaj resztę wpisów for (int i = 0; i < negotiationIDList.Count; i++) { receivedSnps.Add(_snpNegotiationAnswerBack[(negotiationIDList[i])].Negotiation_AllocatedSNP); receivedSnpsAreaNames.Add(_snpNegotiatinAnswerBackAreaName[(negotiationIDList[i])]); } //wyślij wiadomość potwierdzającą LinkConnectionResponse(connectionID, true, receivedSnps, receivedSnpsAreaNames); #endregion }