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) { } }
/// <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; } } } }