Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehere TCP-Verbindungen gleichzeitig aufbauen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Mehere TCP-Verbindungen gleichzeitig aufbauen

    Ich habe vor, Meldungen vom EibPc an mehrere Teilnehmer im Netzwerk zu senden.
    Kann ich mehrer TCP-Verbindungen "gleichzeitig" aufbauen?
    Folgendes hatte ich vor:
    if after(Start == EIN,100u64) then connecttcp(Port1,IP1); connecttcp(Port2,IP2); connecttcp(Port3,IP3); endif
    if after(Start == EIN,200u64) then sendtcp(Port1,IP1,String1); sendtcp(Port2,IP2,String2); sendtcp(Port3,IP3,String3); endif
    if after(Start == EIN,300u64) then closetcp(Port1,IP1); closetcp(Port2,IP2); closetcp(Port3,IP3); endif

    Die Meldungen kommen am ersten Teilnehmer (Port1,IP1). An den anderen beiden nicht.
    Muss ich auf irgendwelche Timings achten oder kann nur eine Verbind aufgebaut sein und nicht mehrere gleichzeitig?

    Gruß
    Markus

    #2
    Moin Markus,

    1. Es dauert bis eine TCP-Verbindung steht
    2. ein sendtcp macht nur Sinn, wenn eine Vebindung schon steht. Das kannst Du über den Rückgabewert der connecttcp() Funktion feststellen.

    Wenn Du Dir ganz sicher bist, das ein connecttcp funktionieren wird, kannst Du etwas länger warten bis Du das sendtcp machst.

    Wenn Du es "richtig" machen willst, dann mußt die erfolgreiche Verbindungserstellugn abwarten.

    Mehrere Verbindungen gleichzeitig sollten kein Problem sein, meine ich.

    Gruß,
    Bernd

    Kommentar


      #3
      Habe mal ein Makro geschrieben. Dort warte ich, bis eine Verbindung aufgebaut ist, bevor ich sende. Wenn ich das Makro zweimal im Programm aufrufe mit den selben Übergabeparametern, kommt die Nachricht nur beim ersten "Makro-Empfänger" an.

      Kommentar


        #4
        Poste mal Dein Makro

        Kommentar


          #5
          if change(snarl^PcName_Message) and (!snarl^PcName_Start) then {
          snarl^PcName_Start = EIN;
          snarl^PcName_CloseStatus = 99u08;
          snarl^PcName_ConnectStatus = 99u08;
          snarl^PcName_IsConnected = AUS;
          snarl^PcName_IsClosed = AUS } endif

          // Eine Verbindung zum Meldungsempänger aufbauen
          if after(snarl^PcName_Start,100u64) then snarl^PcName_ConnectStatus = connecttcp(snarl^PcName_Port,snarl^PcName_IP) endif
          // Feststellen, ob eine Verbindung zustande gekommen ist oder schon besteht
          if ((snarl^PcName_ConnectStatus == 0u08) or (snarl^PcName_ConnectStatus == 3u08)) then snarl^PcName_IsConnected = EIN else snarl^PcName_IsConnected = AUS endif
          // Message senden
          if after(snarl^PcName_IsConnected,100u64) then sendtcp(snarl^PcName_Port,snarl^PcName_IP,snarl^Pc Name_MessageString) endif
          // Verbindung wieder schließen
          if after(snarl^PcName_IsConnected,2000u64) then snarl^PcName_CloseStatus = closetcp(snarl^PcName_Port,snarl^PcName_IP) endif
          // Verbindung ist geschlossen
          if (snarl^PcName_CloseStatus == 0u08) or (snarl^PcName_CloseStatus == 5u08) then snarl^PcName_IsClosed = EIN; snarl^PcName_Start = AUS endif

          Kommentar


            #6
            Ja, danke für den Hinweis. Habe die Makros jeweils im gleichen Programmdurchlauf ausgerufen. Wenn man sie zeitlich versetzt aufruft, dann funktioniert es.

            Danke,
            Markus

            Kommentar


              #7
              In meinem Programm kann von mehreren Programmteilen eine Tcp-Verbindung aufgebaut werden bzw eine Email versendet werde. Wie kann ich es verhindern, dass mehrere Programmteile eine Tcp-Verbindung gleichzeitig aufbauen wollen bzw, wie kann ich die Programmteile gegeneinander verriegeln, damit so etwas nicht passiert? Wie viel Zeit/Programmdurchläufe müssen Vergehen bis ein neuer connecttcp ausgelöst werden darf? Hat jemand Erfahrung darin?

              Grus
              Markus

              Kommentar


                #8
                Zitat von Marha Beitrag anzeigen
                Wie kann ich es verhindern, dass mehrere Programmteile eine Tcp-Verbindung gleichzeitig aufbauen wollen bzw, wie kann ich die Programmteile gegeneinander verriegeln, damit so etwas nicht passiert? Wie viel Zeit/Programmdurchläufe müssen Vergehen bis ein neuer connecttcp ausgelöst werden darf? Hat jemand Erfahrung darin?
                Wenn Du den Rückgabewert von connecttcp auswertest, könntest Du weitere connects verhindern durch :
                if NOT_CONNECTED then connecttcp.... endif
                Alle 30 Sekunden beendet der EibPC eine Verbindung, die nichts mehr sendet, automatisch.
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Guten Morgen,
                  Klar könnte ich die Rückgabewerte auswerten (tue ich ja auch), aber wenn ein connect gestartet ist, dauert es ja eine gewisse Zeit bis die Rückgabewerte auswertbar sind. Was passiert, wenn in dieser Zwischenzeit ein neuer, anderer connect gestartet wird? Wie verhält sich der eibPC? Wird der laufende connect überschrieben oder der neue vielleicht verworfen?

                  Gruß
                  Markus

                  Kommentar


                    #10
                    Hallo Markus,

                    ich habe gerade sehr intensiv an diesem Thema in Zusammenhang mit einer Wunderground Wetterabfrage gearbeitet.

                    Es ist sehr zu empfehlen die einzelnen Verbindungsaufbauten durch die connecttcp Rückgabewerte und unterschiedliche Variablen / Zeitpuffer klar voneinander zu trennen.

                    Ohne dies zu tun tauchte bei mir die IP und der Port meiner Wärmepumpen IP Abfrage in der IP Abfrage von Wunderground Wetter auf.

                    Ich werde vermutlich im Laufe der Woche das Wunderground Makro hier veröffentlichen, so dass Du Dir dort anschauen kannst wie ich die Prozesse getrennt habe.

                    Viele Grüße

                    Michael

                    Kommentar


                      #11
                      Hallo Michael,

                      Für die einzelnen connects verwende ich jeweils eigene Variablen. Aber ich glaube, das mein hauptsächliches Problem, die von dir angesprochenen Zeitpuffer sind. Ich weiss über nicht, wie lange ich warten muss, bis ich eine Verbindung wieder schliessen kann, nachdem gesendet wurde. Was passiert z.b. wenn der eibPC gerade eine Verbindung schließen will, oder besser gesagt der Schließvorgang läuft bereits, aber das Programm. Sagt, dass diegleiche Verbindung neu wiederhergestellt werden soll?
                      Ich bin auf dein Makro gespannt. Aber vielleicht kannst du vorab kurz etwas zu den Zeitpuffern sagen.

                      Gruß
                      Markus

                      Kommentar


                        #12
                        Hallo Markus,

                        die einzelnen Variablen habe ich auch vorher gehabt.

                        Die Lösung aber war das richtige Zusammenspiel aus den Schnittstellen Rückmeldungen, Timern und Abgrenzungsvariablen.

                        Das kann ich nicht mit wenigen Worten beschreiben, da ist der Blick ins kommende Makro einfacher.

                        Viele Grüße

                        Michael

                        Kommentar

                        Lädt...
                        X