Example #1
0
        /// <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;
        }
Example #3
0
        /// <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);
            }
        }