Fehlerbehandlung in Synapse (FTP)

Alle Fragen zur Netzwerkkommunikation
Antworten
Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Fehlerbehandlung in Synapse (FTP)

Beitrag von Socke »

Hallo,
ich bastle gerade an meinem FTP-Thread und überlege, wie ich die Fehlerbehandlung am sinnvollsten entwerfe.
Synapse ist ja in dieser Hinsicht so idiotensicher, dass alles so einfach wie möglich ist, aber wie finde ich raus, was für ein Fehler aufgetreten ist, und wie der am besten zu behandeln ist.

Bspw. kann ein fehlerhafter Login auf
  • Falsche Anmeldedaten
  • active/passive Mode
  • Timeout (keine Verbindung)
etc. zurückzuführen sein.

Einen Timeout kann man ja generell immer wieder zwischen durch erhalten (gibt in der Theorie genug Gründe), womit man dann dem Benutzer einfach anbieten könnte, neu zu verbinden bzw. dies automatisch zu tun, da die Verbindung dauerhaft bestehen soll (zwecks Warteschlangenübertragung).

Wie geht ihr die ganze Sache an, bzw. wie sähe der Idealfall aus?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von theo »

Kommt halt drauf an, ob der Fehler am Socket oder beim Protokoll liegt.
Es gibt Sock.OnStatus, wo man Fehler bekommen kann.

z.B.

Code: Alles auswählen

procedure THTTPSendThread.Status(Sender: TObject; 
  Reason: THookSocketReason; const Value: string);
var val: integer;
  desc: string;
begin
  if not Terminated then
  begin
    case Reason of
      HR_ReadCount: GUIMessage(mtProgress, Value, fHTTP.DownloadSize);
      HR_Error:
        begin
          val := StrToIntDef(SeparateLeft(Value, ','), 0);
          desc := SeparateRight(Value, ',');
          if val <> 104 then GUIMessage(mtError, desc, val);
        end;
    end;
  end;
end;



Funktionen hinterlassen auch einen Resultcode, z.B für HTTP

Code: Alles auswählen

if (ResultCode < HTTPRESP_Moved) or (ResultCode > HTTPRESP_Method) and
        (ResultCode <> HTTPRESP_No_such_group) then break


Vielleicht ist das auch interessant:
http://synapse.ararat.cz/doku.php/publi ... ebugsocket

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von Socke »

Danke.
Ich hab da aber noch ein paar Fragen:
A) wäre es nicht sinnvoller, OnMonitor des Sockets für die Fortschritsmeldungen zu verwenden?
B) Muss ich bei FTP für die Datenübertragung TFTPSend.DSock verwenden?
C) Für den Statuscode kann ich doch prinzipiell auch TFTPSend.StatusCode verwenden. Welche der Statuscodes (siehe RFC 959) muss bzw. kann ich auf Anwendungsebene (Benachrichtigung des Benutzers/neuer Verbindungsversuch) reagieren?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von theo »

Socke hat geschrieben:A) wäre es nicht sinnvoller, OnMonitor des Sockets für die Fortschritsmeldungen zu verwenden?

Wenn du die Daten dazu beobachten musst: ja. Kann ich nicht beurteilen.
Socke hat geschrieben:B) Muss ich bei FTP für die Datenübertragung TFTPSend.DSock verwenden?

FTP läuft auf 2 Sockets, Command und Data. DSock ist der Datenkanal.
Socke hat geschrieben:C) Für den Statuscode kann ich doch prinzipiell auch TFTPSend.StatusCode verwenden. Welche der Statuscodes (siehe RFC 959) muss bzw. kann ich auf Anwendungsebene (Benachrichtigung des Benutzers/neuer Verbindungsversuch) reagieren?

K.A. Da geht's ins Detail. Vielleicht hier fragen: http://synapse.ararat.cz/doku.php/support

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von Socke »

theo hat geschrieben:
Socke hat geschrieben:C) Für den Statuscode kann ich doch prinzipiell auch TFTPSend.StatusCode verwenden. Welche der Statuscodes (siehe RFC 959) muss bzw. kann ich auf Anwendungsebene (Benachrichtigung des Benutzers/neuer Verbindungsversuch) reagieren?

K.A. Da geht's ins Detail. Vielleicht hier fragen: http://synapse.ararat.cz/doku.php/support

Ich dachte eine brauchbare Fehlerbehandlung bräuchte jedes gute Programm....
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von theo »

Socke hat geschrieben:Ich dachte eine brauchbare Fehlerbehandlung bräuchte jedes gute Programm....


Das denke ich auch.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von Socke »

Dann mal eine konkrete Frage:

Wie finde ich heraus, ob die Verbindung unterbrochen wurde? Ich habe zwar die Eigenschaft "Timeout" gefunden, aber nichts, wie ich feststellen kann, ob dieser Fall auch eingetreten ist (FTP-ResultCode müsste in diesem Fall undefiniert sein...)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von theo »


Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von Socke »

theo hat geschrieben:Lies doch mal die Synapse Doku
http://synapse.ararat.cz/doku.php/publi ... connection

Danke für den Hinweis, bin wohl doch schon ein bisschen müde :oops:

Wobei diese Seite meine Frage auch nicht ganz beantwortet (das, was da steht, hatte ich mehr oder weniger so erwartet). Einen Timeout kann ich aber feststellen (habs jetzt selbst gefunden, und hoffe, dass es richtig ist):

Code: Alles auswählen

TFTPSend.DSock.LastError =  WSAETIMEDOUT

Zugegeben, ein bisschen mehr Dokumentation könnte nicht Schaden (bspw. für die Unit synsock).

Edit: Womit wir wieder bei meiner Eingangsfrage wären: was mache ich intelligentester Weise nach einem Timeout? Kann ich einfach versuchen noch einmal zu senden (die Pakete sind ja einfach nicht angekommen) oder muss ich die Verbindung neu aufbauen? (Sorry, aber das ist mein erstes Netzwerk-Programm)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von theo »

Socke hat geschrieben:Zugegeben, ein bisschen mehr Dokumentation könnte nicht Schaden (bspw. für die Unit synsock).

Ich kenne wenige Units die so gut dokumentiert sind.
Hast du Tomaten auf den Augen? ;-)
http://synapse.ararat.cz/doc/help/

synsock, resp. ssfpc geht auch keinen was an. Das ist der plattformabhängige Layer. Also keine Schnittstellen, die der User benötigt.

Socke hat geschrieben:Womit wir wieder bei meiner Eingangsfrage wären: was mache ich intelligentester Weise nach einem Timeout? Kann ich einfach versuchen noch einmal zu senden

Das steht haarklein in dem Link den ich dir gepostet habe.
Lies mal die Doku richtig.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von Socke »

Hallo theo,
erstmal vielen Dank für dein unermüdliches Bemühen... ich hoffe ich bin jetzt ein bisschen wacher als gestern/heute Nacht.
theo hat geschrieben:
Socke hat geschrieben:Zugegeben, ein bisschen mehr Dokumentation könnte nicht Schaden (bspw. für die Unit synsock).

Ich kenne wenige Units die so gut dokumentiert sind.
Hast du Tomaten auf den Augen? ;-)
http://synapse.ararat.cz/doc/help/

synsock, resp. ssfpc geht auch keinen was an. Das ist der plattformabhängige Layer. Also keine Schnittstellen, die der User benötigt.

Im Vergleich zu anderen Projekten ist Synapse für den Benutzer wirklich gut dokumentiert, auch wenn einige Stellen nicht eindeutig sind (zumindest für einen Unwissenden wie mich). Wobei mir gerade auffällt, dass die Dokumentation im Internet eine andere als auf meinem Rechner ist. Ich hab mir damals Synapse 0.6.2 (stable) gesaugt. Ist das überhaupt richtig oder wäre svn besser?

Die Unit synsock bietet im Endeffekt doch nur eine plattformunabhängige API, die auf WinAPI oder den FPC-bindings aufsetzt. Das heißt, sie muss nicht dokumentiert sein, wenn das, worauf sie aufsetzt dokumentiert ist. Wenn der Benutzer die Unit nicht verwenden soll, müsste er bspw. bei blcksock.TBlockSocket.LastError auf die vom Compiler (bzw. durch die RTL) mitgelieferten Konstanten zurückgreifen (beim FPC mag das noch gehen, aber wenn das Projekt für FPC und Delphi ist, ist das bescheuert, und warum sollte ich nicht die vorhandenen Konstanten benutzen?).

So, jetzt nochmal zu meiner Frage. Wenn du mit Link, http://synapse.ararat.cz/doku.php/publi ... connection meinst, übertrage ich das mal kurz:
"Direktes Testen ist nicht möglich. Die einzige Möglichkeit ist, Daten zu senden bzw. zu empfangen und den Rückgabe-/Fehlerwert auszuwerten." Zum reinen Testen könnte man also bei FTP den NoOP-Befehl verwenden.
Meine Frage bezog sich nicht direkt auf das reine Testen. Ich hatte viel mehr vor, die Daten direkt zu senden/empfangen und deren ResultCode auszuwerten. TFTPSend.ResultCode beinhaltet nach meinem Verständnis ("After FTP command contains result number of this operation.") aber den vom FTP-Server zurück gelieferten Wert (bei NoOP 200). Im Falle eines Verbindungsabbruchs (Stecker gezogen) kann vom Server aber keine Antwort kommen, das FTP-Ergebnis müsste deshalb undefiniert sein (Synapse setzt, wenn kein Wert zur Verfügung (also nicht nur Timeouts) steht, den Code 0). Trotzdem erhalte ich vom Socket einen Statuscode (TBlockSocket.LastError), den ich auswerten kann.

Hab ich das jetzt so richtig verstanden oder gibts noch irgendwo Fehler/Suboptimalitäten?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehlerbehandlung in Synapse (FTP)

Beitrag von theo »

Socke hat geschrieben:Hab ich das jetzt so richtig verstanden oder gibts noch irgendwo Fehler/Suboptimalitäten?


Ich hab Synapse nicht geschrieben. Du weisst wahrscheinlich bereits mehr als ich.
Sonst, wie bereits gesagt, frag den Autor oder andere Experten auf der Synapse Mailing List:
http://synapse.ararat.cz/doku.php/support

Antworten