Пример #1
0
        public void CreateConnect(string addressConnectIP, string key, CancellationToken cancellationToken = default(CancellationToken))
        {
            Socket socket        = null;
            Socket listenerAgent = null;
            Socket agentSending  = null;


            try
            {
                byte[] bytes = new Byte[128];



                string numberOfRouter = key.Substring(0, 1);

                //Sklejenie czesci wspolnej klucza dla socketu OUT oraz indeksu
                string settingsString = numberOfRouter + "Agent";

                IPAddress ipAddress =
                    ipAddress = IPAddress.Parse(OperationConfiguration.getSetting(settingsString, mySettings));
                IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

                // Create a TCP/IP socket.
                listenerAgent = new Socket(ipAddress.AddressFamily,
                                           SocketType.Stream, ProtocolType.Tcp);

                if (!listenerAgent.IsBound)
                {
                    //zabindowanie na sokecie punktu koncowego
                    listenerAgent.Bind(localEndPoint);
                    listenerAgent.Listen(100);
                }
                int milliseconds = 100;
                //Nasluchujemy bez przerwy
                while (Last)
                {
                    if (Listening)
                    {
                        //Dodanie socketu do listy socketow OUT
                        agentSending = sS.ConnectToEndPoint(addressConnectIP);


                        Thread.Sleep(milliseconds);

                        SendingNodeIsUpMessage(agentSending, OperationConfiguration.getSetting(settingsString, mySettings), Int16.Parse(numberOfRouter));



                        //oczekiwanie na polaczenie
                        socket = listenerAgent.Accept();

                        SendingKeepAliveMessage(OperationConfiguration.getSetting(settingsString, mySettings), agentSending);

                        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("Connect on port  " + NetworkNode.takingAddresListenerSocket(socket));
                        byte[] msg;


                        if (socket.Connected)
                        {
                            //Oczekiwanie w petli na przyjscie danych
                            while (true)
                            {
                                string from = string.Empty;
                                //Odebranie tablicy bajtow na obslugiwanym w watku sluchaczu

                                msg = sl.ProcessRecivedBytes3(socket);
                                NMSPackage package       = new NMSPackage();
                                string     usableMessage = NMSPackage.extractUsableMessage(msg, NMSPackage.extractUsableInfoLength(msg));
                                Console.WriteLine(usableMessage);
                                fillingTable(usableMessage, agentSending, settingsString);
                                // Package.extractHowManyPackages(msg);
                                // listByte.Add(msg);

                                //Wykonuje jezeli nadal zestawione jest polaczenie

                                if (msg == null)
                                {
                                    //Rozpoczynamy proces nowego polaczenia

                                    break;
                                }
                            }
                        }
                    }
                    ConsoleKeyInfo cki;
                    while (true)
                    {
                        cki = Console.ReadKey();
                        if (cki.Key == ConsoleKey.Escape)
                        {
                            break;
                        }
                    }
                }
            }
            catch (SocketException se)
            {
                Console.WriteLine($"Socket Exception: {se}");
            }
            finally
            {
                // StopListening();
            }
            if (socket == null)
            {
            }
        }
Пример #2
0
        /// <summary>
        /// funkcja obsługująca przychodzącą wiadomość
        /// </summary>
        /// <param name="listener"></param>
        private void ReceivedMessage(Socket listener)
        {
            string usableMessage = "";

            while (true)
            {
                // wyczyszczenie paczki przed jej wysłaniem oraz przed ponownym wysyłaniem
                usableMessage = string.Empty;

                //przypisywanie do paczki wiadomości przesłanej przez klienta, w tym przypadku przez agenta
                byte[] nmspackage = new byte[64];

                // tylko jeden wątek moze wykonywac ten kod w danym czasie
                //  lock (_syncRoot)
                //   {
                nmspackage = ls.ProcessRecivedByteMessage(listener);
                //   }
                // wykonuje się tylko wtedy jeśli agent nie  jest podłączony
                if (!listener.Connected)
                {
                    // pobranie indeksu socketu z listy soecketów
                    int index = listening_socket.IndexOf(listener);
                    UpdateListBoxReceived("Network Node" + getIPAddressRemote(sends_socket.ElementAt(index)) + " is disconnected");
                    // rozłączanie obu socketów
                    listener.Disconnect(true);
                    //send.Disconnect(true);

                    //usuwanie socketów, adresów z list by przy ponownym połączeniu dodawać je na ponownie
                    listening_socket.RemoveAt(index);
                    sends_socket.RemoveAt(index);
                    routers_IP.RemoveAt(index);

                    // wyświetlanie pobranego adresu IP z list podłączonych agentów
                    _Application.comboBoxRouters.Invoke(new Action(delegate()
                    {
                        comboBoxRouters.Items.RemoveAt(index);
                    }));
                    break;
                }
                // wykonuje się tylko wtedy jeśli agent jest podłączony
                else
                {
                    string sourceip;
                    //tylko jesli paczka nie jest nullem
                    if (nmspackage != null)
                    {
                        usableMessage = NMSPackage.extractUsableMessage(nmspackage, NMSPackage.extractUsableInfoLength(nmspackage));
                        //tylko w przypadku pierwszej wiadomości od danego agenta
                        if (usableMessage == "Network node is up")
                        {
                            sourceip = NMSPackage.exctractSourceIP(nmspackage).ToString();
                            //jesli lista z adresami IP routerów nie zawiera danego IP to je dodaje a następnie wyśwuietlam komunikat
                            if (!routers_IP.Contains(sourceip))
                            {
                                routers_IP.Add(sourceip);
                                UpdateListBoxReceived("Network Node: " + sourceip + " is up");
                                UpdateListBoxReceived(listening_socket.Count.ToString());
                            }
                            //tworze połączenie z socketem routera, który wysłał do mnie wiadomość
                            send = sS.ConnectToEndPoint(NMSPackage.exctractSourceIP(nmspackage).ToString());
                            // a następnie dodaje ten socket do listy socketów, by potem móc z nich korzystać
                            sends_socket.Add(send);

                            short numberOfRouter = NMSPackage.extractNumberOfRouterNumber(nmspackage);

                            List <string> configurationRouter = ReadingFromFile(paths.ElementAt(numberOfRouter - 1));
                            foreach (var line in configurationRouter)
                            {
                                short      length              = (Int16)line.Length;
                                NMSPackage tablePackage        = new NMSPackage(interfaces.ElementAt(numberOfRouter - 1), line, length);
                                byte[]     tablePackageInBytes = tablePackage.toBytes();
                                send.Send(tablePackageInBytes);
                                Task.Delay(10);
                            }



                            /* z kazdą wiadomością "Network node is up" dodaje IP routera do checkboca w celu mozliwości wybrania
                             * docelwoego punktu komunikacji */
                            _Application.comboBoxRouters.Invoke(new Action(delegate()
                            {
                                _Application.comboBoxRouters.Items.Add(sourceip);
                            }));
                        }
                        //jesli wiadmośc keep alive
                        else if (usableMessage == "Keep Alive")
                        {
                            // UpdateListBoxReceived(usableMessage);
                        }
                        else if (usableMessage == "ERROR")
                        {
                            UpdateListBoxReceived("Cannot send EON Table to the node agent");
                        }
                        else if (usableMessage.StartsWith("TOPOLOGY"))
                        {
                            UpdateListBoxReceived(usableMessage);
                        }
                    }
                    //jesli paczka jest nullem
                    else
                    {
                        int index = listening_socket.IndexOf(listener);
                        // stwierdzam, że agent nie odpowiada, a potem go rozłączam
                        UpdateListBoxReceived("Network Node" + getIPAddressRemote(sends_socket.ElementAt(index)) + " is not responding");
                        UpdateListBoxReceived("Network Node" + getIPAddressRemote(sends_socket.ElementAt(index)) + " is disconnected");

                        listening_socket.RemoveAt(index);
                        sends_socket.RemoveAt(index);
                        routers_IP.RemoveAt(index);
                        _Application.comboBoxRouters.Invoke(new Action(delegate()
                        {
                            comboBoxRouters.Items.RemoveAt(index);
                        }));
                        //odłączanie
                        listener.Disconnect(true);
                        //send.Disconnect(true);
                        //usuwanie socketów, adresów z list by przy ponownym połączeniu dodawać je na ponownie

                        break;
                    }
                }
            }
        }