Announcement

Collapse
No announcement yet.

Indy: Verbindungabbau

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Indy: Verbindungabbau

    Hallo @ all!

    Zur Zeit versuche ich meinen ersten Versuch mit Client/Server-Progrsmmierung zu erweitern. Bis jetzt habe ich 2 Projekte erstellt Client und Server. Verbindung und Austausch der Informationen zwischen Server und Client funktioneren. Allerdings beim Abbau der Verbindung habe ich ein Problem und zwar nach dem Aufruf der Funktion IdTCPClient->Disconnect() bleibt die Verbindung bestehen (siehe Unten).

    Beim Kilcken auf Button "DISCONNECT" (auf dem Client) wir folgender Code aufgerufen:

    Code:
    void __fastcall TForm1::btnDisconnectClick(TObject *Sender)
    {
    	bool MyConnection;			    <- Lokale Variable (zum Testen)
    
    	MyConnection = IdTCPClient->Connected();    <- MyConnection ist "true"
    
    	Timer1->Enabled = false;		    <- zusaetzliche Aktion (hier keine Bedeutung)
    
    	if (IdTCPClient->Connected())		    <- Abfrage: Ist der Client noch verbunden? Wenn ja (true), dann Verbindung trennen.
    	{
    	    IdTCPClient->Disconnect();              <- Hier wird OnDisconnected Evetn ausgelöst und IdTCPClientDisconnected aufgerufen
    	}
    
    	MyConnection = IdTCPClient->Connected();    <- Hier ist MyConnection IMMER NOCH "true"  ?????
    }
    
    void __fastcall TForm1::IdTCPClientDisconnected(TObject *Sender)
    {
    	StatusBar1->SimpleText = "Disconnected";
    }
    Any help?

    Viele Grüße
    Markus

  • #2
    Schon mal etwas gewartet?
    Christian

    Comment


    • #3
      Hallo Christian!

      Danke für prompte Antwort.
      Hier auf dem Forum ist man nicht alleine!

      Nein, nicht gewartet.
      Wie lange sollte man das Programm „sleepen“ lassen? Oder kann man dazu eine Eigenschaft von IdTCPClient benutzen?

      Viele Grüße
      Markus

      Comment


      • #4
        Wie lange sollte man das Programm „sleepen“ lassen?
        Na, erstmal testen, ob es daran liegt....
        bsp 5 Sek.
        Christian

        Comment


        • #5
          Hallo Christian!

          Das 5s Warten hat nichts gebracht.

          Hier eine Beschreibung:

          Design und gewünschte Funktionsweise (Client):
          In meiner Client-Applikation habe ich drei Buttons: "Connect", "Send message" und "Disconnect".

          Button "Connect" baut die Connection auf.
          Button "Send message" aktiviert einen Timer. Beim jedem Takt des Timers wird eine Message an den Server geschikt.
          Button "Disconnect" deaktiviert den Timer und soll die Verbindung zwischen Client und Server beenden.

          Praxis:
          Beim Click auf "Connect" wird die Connection fehlerfrei aufgebaut.
          Beim Click auf "Send message" wird gecheckt ob der Client noch mit dem Server verbunden ist. Wenn ja dann wird der Timer aktiviert und Messages an den Server geschickt. Sie werden von ihm empfangen und correct in seinen StringGrid aufgenommen.

          Code:
          void __fastcall TForm1::btnSendMessageClick(TObject *Sender)
          {
          	if (IdTCPClient->Connected())  <- Timer aktivieren nur wenn Verbindung steht.
          	{
          		Timer1->Enabled = true;  
          	}
          }
          Beim Click auf "Disconnect" wird der Timer deaktiviert und das Senden der Nachrichten an den Server wird unterbrochen. Der Server bekommt keine Messages mehr -> sein StringGrid baut sich nicht mehr auf.

          Nun wollte ich checken was passiert, wenn ich in diesem Zustand noch mal den Button "Send message" clicke. Nach dem erneutem Click auf "Send message" werden viele nacheinander folgende Exceptions ausgelöst: "Connectionn Closed Gracefully".

          Folge: viele, viele, viele nacheinander folgende Fehlermeldungen: "Connectionn Closed Gracefully". Sie waren immer mehr so das ich den Client mit Hilfe des Task-Menagers abschiessen musste

          Viele Grüße
          Markus

          Comment


          • #6
            Und warum blendest du dem Button nicht aus, wenn die Verbindung beendet wurde (enabled)?

            Lt. der Fehlermeldung wurde die Verbindung beendet
            Christian

            Comment


            • #7
              Hallo Christian!

              A. Button ausblenden.
              Ja, das ist vollkommen richtig! Man könnte (vielleicht sollte man auch) den Button „Send message“ disablen, nachdem der Button „Disconnect“ geklickt wurde . Das würde einige Probleme lösen.

              B. Fehlermeldung.
              Ja, das ist der Punkt! Die Fehlermeldung besagt: „Verbindung getrennt“. Aber die Abfrage in btnSendMessageClick() besagt: „IdTCPClient->Connected() = true“. Ähnlich wie „MyConnection = true“ in btnDisconnectClick. Und das verstehe ich nicht.

              Viele Grüße
              Markus

              Comment


              • #8
                Vielleicht Zitat: If Connect() exits without throwing an exception, Connected() is guaranteed to return true until you perform a read/write operation. Remote disconects on a blocking socket be only be detected after a read/write operation has been performed. You can't call Connected() while Connect() is still running. The state of the connection is not stable until Connect() exits.
                Christian

                Comment


                • #9
                  Hallo Christian!


                  Den Fehler mit der nicht geschlossenen Verbindung konnte ich klären. Es ist einfach so, dass die Verbindung von Client solange als nicht geschlossen angesehen wird, solange es sich noch Daten im InputBuffer befinden. Also man muss dafür sorgen dass alle Daten, die der Server geschickt hat, von dem Client abgeholt werden. Dann wird die Verbindung auch sauber geschlossen.

                  Schöne Weihnachten

                  Markus

                  Comment

                  Working...
                  X