AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy: connection closed gracefully (ich weiß, ich weiß)

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

Ein Thema von S - tefano · begonnen am 22. Jan 2004 · letzter Beitrag vom 23. Jan 2004
Antwort Antwort
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#1

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

  Alt 22. Jan 2004, 22:58
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...

Ü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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 23. Jan 2004, 08:54
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.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 23. Jan 2004, 11:16
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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

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

  Alt 23. Jan 2004, 13:22
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
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 23. Jan 2004, 14:52
Hi,

wow, das hat mich jetzt erstmal ein bisschen Zeit zum Durchblicken gekostet
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
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 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