/// <summary> /// </summary> /// <param name="adresIPListener">Parametrem jest adres IP na ktorym nasluchujemy </param> /// /// <param name="key">Parametrem jest warotsc klucza wlasnosci z pliku config </param> public void CreateConnect(string addressConnectIP, string key, CancellationToken cancellationToken = default(CancellationToken)) { Socket socketClient = null; Socket listener = null; try { byte[] bytes = new Byte[128]; Task.Run(async() => { Stopwatch sw = Stopwatch.StartNew(); while (true) { if (zeroTimer == true) { sw = Stopwatch.StartNew(); canIClearMyBuffers = false; zeroTimer = false; } var wait = await Task.Run(async() => { await Task.Delay(500); sw.Stop(); return(sw.ElapsedMilliseconds); }); canIClearMyBuffers = true; } }); //Znajac dlugosc slowa "Sending" pobieram z calej nazwy klucza tylko index, ktory wykorzystam aby dopasowac do socketu IN ///1-Router ///2-Client ///3-NMS string typeOfSocket = key.Substring(8, key.Length - 8); string numberOfRouter = key.Substring(0, 1); //Sklejenie czesci wspolnej klucza dla socketu OUT oraz indeksu string settingsString = numberOfRouter + "Listener" + typeOfSocket; IPAddress ipAddress = ipAddress = IPAddress.Parse(OperationConfiguration.getSetting(settingsString, mySettings)); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); // Create a TCP/IP socket. listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); if (!listener.IsBound) { //zabindowanie na sokecie punktu koncowego listener.Bind(localEndPoint); listener.Listen(100); } //Nasluchujemy bez przerwy while (Last) { if (Listening) { //Dodanie socketu do listy socketow OUT socketSendingList.Add(sS.ConnectToEndPoint(addressConnectIP)); //oczekiwanie na polaczenie socketClient = listener.Accept(); //dodanie do listy sluchaczy po przez delegata socketListenerList.Add(socketClient); Socket send = null; Listening = false; string tmp = string.Empty; //wyznaczenie socketu przez ktory wyslana zostanie wiadomosc if (numberOfRouter == "1") { tmp = "127.0.0.12"; } else if (numberOfRouter == "2") { tmp = "127.0.0.10"; } else if (numberOfRouter == "3") { tmp = "127.0.0.8"; } //Oczekiwanie w petli na przyjscie danych while (true) { byte[] msg; string from = string.Empty; //Odebranie tablicy bajtow na obslugiwanym w watku sluchaczu msg = sl.ProcessRecivedBytes(socketClient); stateReceivedMessageFromCableCloud(msg, socketClient); // Package.extractHowManyPackages(msg); // listByte.Add(msg); //Wykonuje jezeli nadal zestawione jest polaczenie if (socketClient.Connected) { //Uzyskanie czestotliwosci zawartej w naglowku- potrzebna do okreslenia ktorym laczem idzie wiadomosc portNumber = Package.extractPortNumber(msg); from = takingAddresListenerSocket(socketClient) + " " + portNumber; Package p = new Package(msg); foreach (var socket in socketSendingList) { //zwracamy socket jeśli host z ktorym sie laczy spelnia warunek zgodnosci adresow z wynikiem kierowania lacza if (takingAddresSendingSocket(socket) == tmp) { send = socket; } } List <Queue <byte[]> > listOfQueue = new List <Queue <byte[]> >(); List <Queue <byte[]> > listOfQueues = commutationField.processPackage(msg); //Jak zwrocila null to jeszcze bufor nie jest pelny if (listOfQueues == null) { /* if (canIClearMyBuffers == true) * { * byte[] tempBufferIn; * for (int z = 0; z < commutationField.bufferIn.queue.Count; z++) * { * while (commutationField.bufferIn.queue.Count > 0) * { * tempBufferIn = commutationField.bufferIn.queue.Dequeue(); * byte[] obytes = commutationField.borderNodeCommutationTable.changePackageHeader2(tempBufferIn, ref commutationField); * * stateSendingMessageToCableCloud(obytes, send); * sS.SendingPackageBytes(send, obytes); * } * } * canIClearMyBuffers = false; * zeroTimer = true; * * }*/ continue; }//w przeciwnym razie zwraca nam liste kolejek else { for (int i = 0; i < listOfQueues.Count; i++) { //Dopoki cos jest w podkolejce while (listOfQueues[i].Count != 0) { //Element z listy kolejek moze byc nullem if (listOfQueues[i].Count != 0) { stateSendingMessageToCableCloud(listOfQueues[i].Peek(), send); //Zdjecie z kolejki pakietu i wyslanie go sS.SendingPackageBytes(send, listOfQueues[i].Dequeue()); } //A jak jest nullem to nic nie robimy } } } } else { //Jezeli host zerwie polaczneie to usuwamy go z listy przetrzymywanych socketow, aby rozpoczac proces nowego polaczenia int numberRemove = socketListenerList.IndexOf(socketClient); socketListenerList.RemoveAt(numberRemove); socketSendingList.RemoveAt(numberRemove); break; } } Listening = true; } } } catch (SocketException se) { Console.WriteLine($"Socket Exception: {se}"); } finally { // StopListening(); } if (socketClient == null) { } }
/// <summary> /// Zdejmowanie pakietu z bufora wyjsciowego i wysylanie go (jezeli uplynie timeout lub bufor jest pelny) /// </summary> /// <param name="send"></param> public async Task sendPackage(Socket send) { //Gdy bufory sa puste, to nie kontynuujemy bool canIContinue = true; while (commutationField.BuffersOut[0].queue.Count != 0) { //czekamy iles milisekund //canIContinue = await waitABit(100); //Console.WriteLine("sendPackage()"); if (commutationField.BuffersOut[0].queue.Count != 0) { //Jezeli rozmiar bufora osiagnal maksimum lub timer pozwolil na oproznienie buforow if (commutationField.BuffersOut[0].queue.Count == commutationField.maxBuffOutSize || CanIClearMyBuffers) { //kolejka jest pusta if (commutationField.BuffersOut[0].queue.Count == 0) { //wyswietlenie informacji na konsoli Console.WriteLine(" [ " + Timestamp.generateTimestamp() + " ]" + " Empty OUT buffer!"); break; } //Dopoki kolejka nie jest pusta while (commutationField.BuffersOut[0].queue.Count > 0) { //zdjecie pakietu z kolejki wyjsciowej var tmp = commutationField.BuffersOut[0].queue.Dequeue(); //wyswietlenie informacji na konsoli Console.WriteLine(" [ " + Timestamp.generateTimestamp() + " ]" + " Package dequeued from OUT buffer (buffer size = " + commutationField.BuffersOut[0].queue.Count + ") " + Package.extractID(tmp) + " number " + Package.extractPackageNumber(tmp) + " of " + Package.extractHowManyPackages(tmp)); //Wypisanie informacji na ekran o wyslaniu pakietu stateSendingMessageToCableCloud(tmp, send); //Zdjecie z kolejki pakietu i wyslanie go sS.SendingPackageBytes(send, tmp); } //mozna wyzerowac licznik zeroTimer = true; //wyswietlenie informacji na konsoli //Console.WriteLine(" [ " + Timestamp.generateTimestamp() + " ]" + // " (sendPackage)zeroTimer = " + zeroTimer); //nie mozna czyscic buforow wyjsciowych // CanIClearMyBuffers = false; //wyswietlenie informacji na konsoli //Console.WriteLine(" [ " + Timestamp.generateTimestamp() + " ]" + // " (sendPackage)canIClearMyBuffers = " + canIClearMyBuffers); } } } CanIClearMyBuffers = false; }
/// <summary> /// Funkcja uruchamiana w momencie naciśnięcia przycisku wysyłania /// </summary> /// <param name="sender">Obiekt, który odpowiedzialny jest za wysłanie eventu</param> /// <param name="e">Otrzymany event po naciśnięciu przycisku</param> private void buttonSend_Click(object sender, EventArgs e) { //Cel wysyłania naszej wiadomości, pobrany z comboBoxa string destination = comboBoxClients.SelectedItem.ToString(); //Ustawienie wartości true pozwala na zatrzymanie wysyłania buttonStopSendingClicked = false; if (buttonSendClicked == false) { t = Task.Run(async() => { //Pętla odpowiedzialna za ciągłe wysyłanie wiadomości do wyznaczonego klienta while (buttonStopSendingClicked != true) { short frameID = (short)(new Random()).Next(0, short.MaxValue); //Pobranie wiadomości string message = textBoxMessage.Text; short messageLength = (short)message.Length; byte[] bytemessage; List <byte[]> packageList = new List <byte[]>(); if (messageLength > Package.usableInfoMaxLength) { double numberOfPackages = (Math.Ceiling((double)messageLength / Package.usableInfoMaxLength)); short tmpLength = Convert.ToInt16(messageLength - (short)((short)(numberOfPackages - 1) * Package.usableInfoMaxLength)); for (int i = 0; i < numberOfPackages; i++) { if (i < numberOfPackages - 1) { bytemessage = null; EONpackage = new Package(message.Substring(i * Package.usableInfoMaxLength, Package.usableInfoMaxLength), 1, destination, _ClientApplication.ClientIP, Convert.ToInt16(Package.usableInfoMaxLength), Convert.ToInt16(i + 1), (short)(-1), (short)(-1), (short)(-1), (short)(-1), frameID, Convert.ToInt16(numberOfPackages)); bytemessage = EONpackage.toBytes(); } else { bytemessage = null; EONpackage = new Package(message.Substring(i * Package.usableInfoMaxLength, messageLength - i * Package.usableInfoMaxLength), 1, destination, _ClientApplication.ClientIP, tmpLength, Convert.ToInt16(i + 1), (short)(-1), (short)(-1), (short)(-1), (short)(-1), frameID, Convert.ToInt16(numberOfPackages)); bytemessage = EONpackage.toBytes(); } packageList.Add(bytemessage); } if (send.Connected) { for (int i = 0; i < packageList.Count(); i++) { string timestamp2 = Timestamp.generateTimestamp(); //Wysłanie wiadomości (tablicy bajtów) za pośrednictwem gniazda sS.SendingPackageBytes(send, packageList[i]); _ClientApplication.updateLogTextBox("[" + timestamp2 + "] == SENDING PACKAGE number: " + (i + 1) + " == "); var wait = await Task.Run(async() => { Stopwatch sw = Stopwatch.StartNew(); await Task.Delay(10); sw.Stop(); return(sw.ElapsedMilliseconds); }); } } //Stworzenie znacznika czasowego string timestamp = Timestamp.generateTimestamp(); _ClientApplication.updateLogTextBox("[" + timestamp + "] == SENDING MESSAGE in " + numberOfPackages + " packages == " + " D_ClientIP " + destination); } else { //Stworzenie wysyłanej paczki bytemessage = null; EONpackage = new Package(message, 1, destination, _ClientApplication.ClientIP, messageLength, Convert.ToInt16(1), (short)(-1), (short)(-1), (short)(-1), (short)(-1), frameID, 1); bytemessage = EONpackage.toBytes(); //Stworzenie znacznika czasowego string timestamp = Timestamp.generateTimestamp(); //Zamiana paczki na tablicę bajtów if (send.Connected) { //Wysłanie wiadomości (tablicy bajtów) za pośrednictwem gniazda sS.SendingPackageBytes(send, bytemessage); //Zaktualizowanie LogEventTextBoxa _ClientApplication.updateLogTextBox("[" + timestamp + "] == SENDING MESSAGE == D_ClientIP " + destination); } } //Task, który służy wprowadzeniu opóźnienia między kolejnymi wysłanymi pakietami var delay = await Task.Run(async() => { Stopwatch sw = Stopwatch.StartNew(); await Task.Delay(3000); sw.Stop(); return(sw.ElapsedMilliseconds); }); } }); } //Zablokowanie podwójnego naciśnięcia przycisku wysyłania buttonSendClicked = true; }
/// <summary> /// Funkcja sluży do /// Zwraca socket /// </summary> /// <param name="adresIPListener">Parametrem jest adres IP na ktorym nasluchujemy </param> /// /// <param name="key">Parametrem jest warotsc klucza wlasnosci z pliku config </param> private static Socket ListenAsync(string adresIPListener, string key, CancellationToken cancellationToken = default(CancellationToken)) { Socket socketClient = null; Socket listener = null; IPAddress ipAddress = ipAddress = IPAddress.Parse(adresIPListener); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); cancellationToken.ThrowIfCancellationRequested(); try { byte[] bytes = new Byte[1024]; // Create a TCP/IP socket. listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); if (!listener.IsBound) { //zabindowanie na sokecie punktu koncowego listener.Bind(localEndPoint); listener.Listen(100); } cancellationToken.ThrowIfCancellationRequested(); //Nasluchujemy bez przerwy while (Last) { if (Listening) { //oczekiwanie na polaczenie socketClient = listener.Accept(); //dodanie do listy sluchaczy po przez delegata sd(socketClient); Socket send = null; //Znajac dlugosc slowa "Listener" pobieram z calej nazwy klucza tylko index, ktory wykorzystam aby dopasowac do socketu OUT string str = key.Substring(8, key.Length - 8); //Sklejenie czesci wspolnej klucza dla socketu OUT oraz indeksu string settingsString = "Sending" + str; //Dodanie socketu do listy socketow OUT socketSendingList.Add(sS.ConnectToEndPoint(OperationConfiguration.getSetting(settingsString, readSettings))); Listening = false; LingerOption myOpts = new LingerOption(true, 1); socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, myOpts); socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false); socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); Console.WriteLine("Polaczenie na " + takingAddresListenerSocket(socketClient)); string fromAndFrequency; //Oczekiwanie w petli na przyjscie danych while (true) { //Odebranie tablicy bajtow na obslugiwanym w watku sluchaczu msg = sl.ProcessRecivedBytes(socketClient); // Package.extractHowManyPackages(msg); // listByte.Add(msg); //Wykonuje jezeli nadal zestawione jest polaczenie if (socketClient.Connected) { stateReceivedMessage(msg, socketClient); //Uzyskanie czestotliwosci zawartej w naglowku- potrzebna do okreslenia ktorym laczem idzie wiadomosc frequency = Package.extractPortNumber(msg); fromAndFrequency = takingAddresListenerSocket(socketClient) + " " + frequency; //wyznaczenie socketu przez ktory wyslana zostanie wiadomosc send = sendingThroughSocket(fromAndFrequency); stateSendingMessage(msg, send, fromAndFrequency); //wyslanei tablicy bajtow sS.SendingPackageBytes(send, msg); } else { //Jezeli host zerwie polaczneie to usuwamy go z listy przetrzymywanych socketow, aby rozpoczac proces nowego polaczenia int numberRemove = socketListenerList.IndexOf(socketClient); socketListenerList.RemoveAt(numberRemove); socketSendingList.RemoveAt(numberRemove); break; } } Listening = true; } } } catch (SocketException se) { Console.WriteLine($"Socket Exception: {se}"); } finally { // StopListening(); } if (socketClient == null) { return(new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp)); } return(socketClient); }
/// <summary> /// Funkcja uruchamiana w momencie naciśnięcia przycisku odpowiedzialnego za wysyłanie wiadomości o losowej długości /// </summary> /// <param name="sender">Obiekt, który odpowiedzialny jest za wysłanie eventu</param> /// <param name="e">Otrzymany event po naciśnięciu przycisku</param> private void buttonDifferentMessages_Click(object sender, EventArgs e) { if (comboBoxClients.SelectedItem != null) { //Pobranie celu do którego wysłana zostanie wiadomość //string destination = comboBoxClients.SelectedItem.ToString(); string DestinationID = comboBoxClients.SelectedItem.ToString(); //Zmiana ustawienia przycisku kończącego wysyłanie buttonStopSendingClicked = false; t = Task.Run(async() => { //Wygenerowanie losowego ID short frameID = (short)(new Random()).Next(0, short.MaxValue); string message = null; //Liczba wysyłanych wiadomości int nbOfMessages = Int32.Parse(textBoxHowManyMessages.Text); //Wiadomość w postaci bytes byte[] bytemessage; //Pętla odpowiedzialna za wysłanie odpowiedniej ilości wiadomości. for (int i = 0; i < nbOfMessages; i++) { //Generowanie losowej wiadomości o maksymalnej długości 37 bitów message = RandomMessageGenerator.generateRandomMessage(37); //Pobranie długości wygenerowanej wiadomości short messageLength = (short)message.Length; bytemessage = null; //Stworzenie wysyłanej paczki int portA = 0; if (ClientIP == "127.0.0.2") { portA = 2; } else { portA = 1; } int index = _CPCC.establishedConnections.FindIndex(x => x.Equals(DestinationID)) + 1; EONpackage = new Package(message, (short)portA, _CPCC.establishedConnections[index], _ClientApplication.ClientIP, messageLength, Convert.ToInt16(1), (short)(-1), (short)(-1), (short)(-1), (short)(-1), frameID, 1); bytemessage = EONpackage.toBytes(); //Stworzenie znacznika czasowego string timestamp = Timestamp.generateTimestamp(); //Zamiana paczki na tablicę bajtów if (send.Connected) { //Wysłanie wiadomości (tablicy bajtów) za pośrednictwem gniazda sS.SendingPackageBytes(send, bytemessage); //Zaktualizowanie LogEventTextBoxa _ClientApplication.updateLogTextBox("[" + timestamp + "] == SENDING MESSAGE number " + (i + 1) + "== D_ClientID: " + DestinationID + " with frameID: " + frameID); } var wait = await Task.Run(async() => { Stopwatch sw = Stopwatch.StartNew(); await Task.Delay(10); sw.Stop(); return(sw.ElapsedMilliseconds); }); } }); } else { MessageBox.Show("You need to select a client!", "Important Message.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); } }