Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy: connection closed gracefully (ich weiß, ich weiß) (https://www.delphipraxis.net/15159-indy-connection-closed-gracefully-ich-weiss-ich-weiss.html)

S - tefano 22. Jan 2004 22:58


Indy: connection closed gracefully (ich weiß, ich weiß)
 
Hi,

erstmal großes sorry dass schon wieder ein Thread über diese Meldung erstellt wird, aber ich komme einfach nicht weiter.
Also, wie der Titel schon sagt geht es um die Indy-Meldung "Connection Closed Gracefully".

Ich habe einen FTP Client, den lass ich im OnAfterClientLogin sofort das Listing machen. Macht er auch.
Bis vor ein paar Stunden hatte ich noch die alte Indy-Version installiert die bei meinem Delphi dabei war. Da haben mich aber die Exceptions genervt, weil sie mich aus ner Schleife herausgeworfen haben.
Bin dann auf Onz's Tutorial gestoßen, mir ne neuere IndyVersion runtergeladen und die IdException.pas entsprechend abgeändert. Vorher die alten Indys deinstalliert und dann die neuen draufgemacht. Die Exceptions bin ich jetzt schonmal los.
Aber immer dann, wenn so ein "Connection Closed Gracefully" auftreten würde, also eigentlich bei jeder Aktion die Daten vom Server holt, kann ich jetzt zwar die Exception abfangen, ABER:
Die Connection wird einfach geschlossen. Direkt nachdem der Client den LIST Befehl übertragen hat (dann kommt noch kurz der Log dass für das Listing irgendwas auf ASCII umgestellt wird), wird die Verbindung aus heiterem Himmel getrennt und ich bekomme im Intercept einen entsprechenden Logtext.
Und ich muss schon sagen, das ärgert mich doch ein wenig... :evil: :wall: :evil: :wall: :evil: :wall: :evil:

Überall wo ich bis jetzt Suchergebnisse nach dieser Meldung bekommen habe gabs immer nur den Tip, die Aktion in einen Try-Except Block zu stellen. Das erübrigt sich bei mir ja eigentlich, weil ich Exceptions von Indy ja schon mit Onzs Methode abfange.
Nur zur Beruhigung: Auch dieses Try-Except Zeug habe ich natürlich ausprobiert -> Die Verbindung wird nach dieser Meldung trotzdem getrennt.

Und in meinem Programm passiert das bestimmt nicht. War mir zwar sehr sicher, hab dann aber trotzdem nochmal nachgeguckt -> nix gefunden wo auf ne Exception disconnectet wird.
3 Fragen also:
- An welcher blöden Stelle wird die Verbindung getrennt, Client oder Server, und wo da?!
- Wie kann ich das unterbinden?
- Kann ich es nicht unterbinden und muss ich als Konsequenz nach jeder Aktion neu connecten?! Wär doch Schwachsinn...

Danke schonmal,

S - tefano

Vjay 23. Jan 2004 08:54

Re: Indy: connection closed gracefully (ich weiß, ich weiß)
 
Ich kann dir zwar nicht direkt helfen, da ich kein Indy benutze, aber hast du das schonmal mit einem anderen FTP-Server probiert. Nicht dass der nen Fehler hat oder so.

S - tefano 23. Jan 2004 11:16

Re: Indy: connection closed gracefully (ich weiß, ich weiß)
 
Ne, am Server liegts nich.
Hab drei andere Ausprobiert, immer das gleiche.
Muss also an den neuen Indys liegen.

Ach mann. Weitere Hilfe ist selbstverständlich erwünscht ;-)

Bis dann,

S - tefano

negaH 23. Jan 2004 13:22

Re: Indy: connection closed gracefully (ich weiß, ich weiß)
 
Diese Exception im original Source der INDY's zu kapseln oder zu entfernen ist eine ziemlich schlechte Idee, sie erfüllt nämlich eine sehr wichtige Aufgabe. Nur, das was du begreifen musst ist WAS die Indy Programmier unter einer Exception verstehen ! Wir gehen nur davon aus das Exception Fehler im programfluß sind, nun die Indy Programmierer sehen eine Exception als Außnahmebedingung also nicht unbedingt als Fehler im Programfluß. Diese Sichtweise ist sehr umstritten und ärgert viele Programmiere am Indy Konzept, aber man kan sich daran gewöhnen.

Nun, wenn die Verbindung einseitigt durch den Server oder Clienten geschlossen wurde OHNE das der Gegenpart darüber informiert wurde, dann entsteht diese Exception. D.h. aber nicht das die Verbindung unterbrochen wurde sondern absichtlich getrennt wurde. Somit ist diese Exception keine Fehlermeldung sondern eher eine Außnahme.

Bei FTP werden zwei Verbindungen benötigt. Die eine, die Steuerleitung, ist immer verbunden und überterägt die FTP Kommandos und deren Rückmeldungen. Auf Grund dieser Kommandos wird es nun erforderlich Daten zu übertragen. Dazu wird EXAKT laut FTP Protokollen und FTP RFC Standards eine Datenleitung=Datensocket, geöffenet. Somit ergibnt sich folgendes Bild:

1.) Kommando vom Client zum Server um eine Datenleitung aufzubauen, meisten PASV oder PORT
2.) bestätigung vom Server empfangen
3.) Datenleitung aufbauen = Sockets verbinden
4.) Kommando LIST an Server senden
4.1.) Daten auf Datenleitung empfangen
4.2.) Datenleitung schließen oder auf Schließen warten
4.3.) Bestätigung für LIST Kommando über Steuerleitung abwarten
4.4.) Datenleitung schließen falls noch offen


Du siehst das in den Schtitten 4.2. oder 4.4. die Datenverbindung getrennt werden kann. Die Reihenfolge ist sehr wohl abhängig von der Implemention der Server. Zb. Microsoft Server schließen erst nam dem Senden von 4.4. die Datenleitung, aber viele UNIX L8 Server schließen die Datebnleitung im Schritt 4.2.
Die richtige Vorgehensweise wäre die des Microsoft FTP Servers, die falsche ist eigenlich die des UNIX L8 Servers. Die Implementation im Indy FTP wird also im Schritt 4.2. die besagte Exception auslösen, aber eben NICHT als Fehler sondern als Ausnahmebedinung als Signal das alle Daten übertragen wurden. Denn im FTP protokoll gibt es sogut wie keine Möglichkeit schon im vornhinein zu erkennen wieviele Daten tatsächlich zu empfangen sind, und ab welchem Moment nun die Daten vollständig übertragen wurde. Also wird einfach die Datenleitung geschlossen, als Signal das alle Daten gesendet wurden. Erst im Schritt 4.4. entscheidet sich nun ob das komplette Kommando sammt Daten wirklich gültig war oder ein Fehler aufgetreten ist.

Somit gibt es mehrere "Fehlerursachen" des Problems:
1.) FTP ist wohl das scheißigste Protokoll das jemals amerikanische Professoren und Doktoren an einer Universität entwickelt haben.
2.) FTP wird sich durch die verschiedenen Berkeley Socket API Implementierungen auf Linux/Unix zu Windows anders verhalten, was wiederum zu verschiedenen Verhaltensweisen der darauf entwickelten FTP Server führt
3.) die FTP Client Software Blibliotheken bauen meistens ganz exakt den RFC Standard und deren Beispeielhafter Komunikationsabläufe nach. Das ist im Grunde falsch und zeigt inwieweit der Programmiere des FTP Clients eigentlich Ahnung von der Sache hatte. D.h. der INDY FTP Client ist nicht der beste seiner Art.

ABER ! Fehler kann man keinem dieser Entwickler unterstellen, der einzigste Fehler war es aus der Not heraus ein experimentelles Universitäten Protokoll das eigentlich NUR ein besseres Messangerprotokoll zwischen Menschen war, als FTP = File Transfer Protokoll zu vergewaltigen.

Gruß Hagen

S - tefano 23. Jan 2004 14:52

Re: Indy: connection closed gracefully (ich weiß, ich weiß)
 
Hi,

wow, das hat mich jetzt erstmal ein bisschen Zeit zum Durchblicken gekostet :wink:
Wie ich aus deinem Text interpretiert habe, war mein Fehler der dass ich in Indy mit den Exceptions rumgepfuscht habe.
Ich hab dann jetzt das Backup (so clever war ich dann doch noch ;-) ) wieder reingesetzt und das Packge neu compiliert. Et voilà: Es läuft wieder, und die Verbindung wird nicht geschlossen.
Juchu!

Danke für die Hilfe,

S - tefano


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz