Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy.get kann Socket-Fehler # 10054 nicht umleiten (https://www.delphipraxis.net/163393-indy-get-kann-socket-fehler-10054-nicht-umleiten.html)

freehead 27. Sep 2011 13:54

Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Hallo Leute
ich hoffe es ist nicht zu unhöflich mit dem ersten Post gleich eine Frage zu stellen aber ich weiß nicht mehr weiter.

kurz:
Ich kann die Indy Exeptions nicht abfangen und das Programm bricht die aktuelle Aktion ab

Detailliert:
Ich versuche ein Programm zu schreiben das mit Hilfe der Indy Komponente von einem Webserver Dateien herunterlädt.
Sollte beim download ein Problem auftreten möchte ich das das Programm kurz wartet und es dann erneut versucht da der Webserver um den es sich handelt chronisch überlastet ist kann das leider öfter passieren.

Das Indy Exeptions auswirft möchte ich gar nicht verhindern sondern umleiten auf eine ListenView Spalte, bei „Fehler 404“ sowie die Meldung das der Webserver die Verbindung ablehnt „Socket-Fehler # 10061 Verbindung abgelehnt.“ funktioniert auch alles wunderbar.
Löse ich aber einen Fehler aus indem ich während des Downloads den Webserver beende erhalte ich eine messagebox mit der Fehlermeldung "Socket-Fehler # 10054 Die Verbindung wurde von Peer zurückgesetzt" die ich weder mit noch ohne Debugger umgeleitet bekomme und was noch störender ist das ganze bricht die repeat schleife ab.

Wie kann ich diese Meldung abfangen?
Ist es möglich das diese Meldung nicht von Delphi/Indy kommen sondern vom Betriebssystem?

Ein Ausschnitt aus meinem Code habe ich hier:
Delphi-Quellcode:
// Download1
function download1(z, q : String): String;
var
  FS : Tfilestream;
begin
  FS := TFileStream.Create(z, fmCreate or fmShareDenyNone);
  try
    try
      Form1.IdHTTP1.Get(q,FS);
      result := '';
      except
      On E:EIdHTTPProtocolException do result := 'HTTP-Fehler: '+IntToStr(E.ErrorCode);
      On E:EIdSocketError do result := E.Message;
    end;
  finally
    FS.Free;
  end;
end;

// test !
procedure TForm1.Button5Click(Sender: TObject);
var
  quelle, ziel, download : String;
begin
  quelle := 'http://192.168.0.2/test/test10mb.bmp';
  ziel := Valuelisteditor1.Values['Zielordner']+'\test10mb.bmp';
  abbruch := false;
  repeat
   //abbruch
    if abbruch then begin
     Form1.idhttp1.Disconnect;
      Form1.Listview1.items[Form1.ListView1.Items.Count-1].subitems[4] := 'abbruch';
      exit;
    end;
   //laden
    Form1.Listview1.items[Form1.ListView1.Items.Count-1].subitems[4] := 'lade';
    download := download1(ziel, quelle);
    //fehler
    if (download <> '') then begin
      Form1.idhttp1.Disconnect;
      Form1.Listview1.items[Form1.ListView1.Items.Count-1].subitems[4] := download;  
      Delay(2000);
      Form1.Listview1.items[Form1.ListView1.Items.Count-1].subitems[0] := inttostr(strtoint(Form1.Listview1.items[Form1.ListView1.Items.Count-1].subitems[0]) + 1);
    end;
  until (download = '');
  Form1.Listview1.items[Form1.ListView1.Items.Count-1].subitems[4] := 'Fertig';
end;

geskill 27. Sep 2011 17:57

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Hey,
du kannst ja mal im Einzelschritt "durchsteppen".

Eigentlich müsste EIdSocketError ja auch diese Exception abfangen.
Delphi-Quellcode:
    try
       Form1.IdHTTP1.Get(q,FS);
       result := '';
    except
       on E:EIdHTTPProtocolException do result := 'HTTP-Fehler: ' + IntToStr(E.ErrorCode);
       on E:EIdSocketError do result := E.Message;
       // Fehler ganz anderer Art??
       on E:Exception do result := 'strange error';
    end;
btw. STRG + D formatiert den Quellcode :P

freehead 27. Sep 2011 23:19

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Zitat:

Zitat von geskill (Beitrag 1127092)
Eigentlich müsste EIdSocketError ja auch diese Exception abfangen.

So hatte ich das auch verstanden.

Zitat:

Zitat von geskill (Beitrag 1127092)
Delphi-Quellcode:
       // Fehler ganz anderer Art??
       on E:Exception do result := 'strange error';

Habe ich übernommen, bringt keine Veränderung.
Wenn ich das Programm mit F7 durch den debugger laufen lasse kommt vor der messagebox die Meldung: Im Projekt Form1.exe ist eine Exeption der Klasse EIDSocketError mit der Meldung 'Socket-Fehler # 10054 Verbindung von Peer zurückgesetzt.' aufgetreten.
Was ja darauf schließen lassen sollte das E:EIdSocketError richtig wäre, ich verstehe es nicht.

fkerber 28. Sep 2011 00:07

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Hi,

tritt das Ganze auch auf, wenn du das Programm komplett ohne IDE startest oder vielleicht nur, wenn du es aus Delphi heraus startest?


LG, Frederic

geskill 28. Sep 2011 01:24

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Bei welcher Zeile genau kommt diese Fehlermeldung? Also in deinem Codeschnipsel.

freehead 28. Sep 2011 09:02

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Zitat:

Zitat von fkerber (Beitrag 1127127)
tritt das Ganze auch auf, wenn du das Programm komplett ohne IDE startest oder vielleicht nur, wenn du es aus Delphi heraus startest?

Auch ohne IDE wird die messagebox nicht abgefangen und das Programm hält.

Zitat:

Zitat von geskill (Beitrag 1127129)
Bei welcher Zeile genau kommt diese Fehlermeldung? Also in deinem Codeschnipsel.

Ich weiß nicht wie ich mir das anzeigen lassen kann welche Zeile mein Programm grade abarbeitet, deshalb habe ich vor und nach das Form1.IdHTTP1.Get(q,FS) ein showmessage gesetzt, wobei das erste noch angezeigt wird das zweite nichtmehr.
Delphi-Quellcode:
showmessage('s')
Form1.IdHTTP1.Get(q,FS);
// wird nicht mehr angezeigt !
showmessage('e')

geskill 28. Sep 2011 12:26

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Hast du den Indy Build, der mit deinem Delphi mitkam oder hast du den neusten ausm SVN/FTP installiert?

Weil meine Vermutung ist, der wirft die Exeption macht dann aber irgendwo im Indy Code noch weiter was dann zum Problem führt.

freehead 28. Sep 2011 12:40

AW: Indy.get kann Socket-Fehler # 10054 nicht umleiten
 
Ich habe noch keinerlei Updates für Indy installiert. Werde das mal versuchen.

Update: 15:15
habe die Version Indy10_4684.zip von http://indy.fulgan.com/ZIP/ eingespielt.

Update: 16:10
Mittlerweile habe ich meinen Fehler gefunden: Form1.idhttp1.Disconnect; das hatte ich eingefügt weil das Programm nach einer serverseitigen Trennung auch wenn der Server wieder verfügbar war immer noch die Meldung Fehler # 10054 ausgab.

Vielen Danke an geskill und fkerber


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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