Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Read Timeout bei Delphi 2007 mit Indy 10 (https://www.delphipraxis.net/93891-read-timeout-bei-delphi-2007-mit-indy-10-a.html)

peterlepan 12. Jun 2007 20:59


Read Timeout bei Delphi 2007 mit Indy 10
 
Hallo!

Bei einer kleinen HTTP-SSL-Anwendung mit Delphi 2007 und den Indy 10 Komponenten habe ich das Problem, dass ich nach dem Ausführen eines Get oder Post einen Read Timeout zurückbekomme, also eine Exception.
Zum Testen habe ich auch das SSL-Beispielprogramm der Indy-komponenten verwendet, dieses brachte in Delphi 7 mit Indy 9 den oben genannten Fehler nicht, wohl aber bei den nachfolgenden Delphi-Versionen mit Indy 10.
Änderungen am Timeout-Parameter der Indy-Komponenten brachten auch keine Abhilfe.
Meine Frage ist nun, wie kann man entweder den Fehler umgehen oder in Delphi 2007 auf die Indy 9 Komponenten wechseln, ohne alles noch mal neu zu installieren.

Peter Tabatt

Thomas Horstmann 12. Jun 2007 21:18

Re: Read Timeout bei Delphi 2007 mit Indy 10
 
Hallo,
ich hatte ein ähnliches Problem mit SSL.
Der Timeout Fehler wurde ausgelöst, auch wenn keine Zeit eingetragen wurde (-1).
Daraufhin habe ich folgendes in Indy angepasst (siehe Code):

Datei : ...Indy_10\Protocols\IdSSLOpenSSL.pas
Function : TIdSSLIOHandlerSocketOpenSSL.ReadFromSource
Zeile : 1394

In den Suchpfad sollten die Indy Verzeichnisse eingebaut werden z.B.:

C:\Programme\Borland\BDS\4.0\source\Indy10\Core
C:\Programme\Borland\BDS\4.0\source\Indy10\Protoco ls

Seitdem klappt es. Hoffe es hilft.

Viele Grüsse
Thomas


Delphi-Quellcode:
...
function TIdSSLIOHandlerSocketOpenSSL.ReadFromSource(
 ARaiseExceptionIfDisconnected: Boolean; ATimeout: Integer;
 ARaiseExceptionOnTimeout: Boolean): Integer;
// Reads any data in tcp/ip buffer and puts it into Indy buffer
// This must be the ONLY raw read from Winsock routine
// This must be the ONLY call to RECV - all data goes thru this method
var
  LByteCount: Integer;
  LBuffer: TIdBytes;
  LLastError: Integer;
begin
  if ATimeout = IdTimeoutDefault then begin
    if ReadTimeOut = 0 then begin
      ATimeout := IdTimeoutInfinite;
    end else begin
      ATimeout := FReadTimeout;
    end;
  end;
  Result := 0;
  // Check here as this side may have closed the socket
  CheckForDisconnect(ARaiseExceptionIfDisconnected);
  if BindingAllocated then begin
    LByteCount := 0;
    repeat
      // *****************************************************************
      // *** Anpassung, Eingefügt                                     ***
      // *** Timeout wird auch bei ATimeOut = -1 ausgelöst.           ***
      // *****************************************************************
      if Readable(ATimeout) or (ATimeOut = -1) then begin

      // *****************************************************************
      // *** Anpassung, Deaktiviert (Original)                        ***
      // *****************************************************************
      // if Readable(ATimeout) then begin

      // *****************************************************************
      // *** Anpassung, Ende                                          ***
      // *****************************************************************

        if Assigned(FRecvBuffer) then begin
          // No need to call AntiFreeze, the Readable does that.
          if BindingAllocated then begin
            SetLength(LBuffer,RecvBufferSize);
            try
              LByteCount := Recv(LBuffer);
              SetLength(LBuffer,LByteCount);
                if Intercept <> nil then begin
                  Intercept.Receive(LBuffer);
                  LByteCount := Length(LBuffer);
                end;
              FRecvBuffer.Write(LBuffer);
          //    WriteBuffer(LBuffer^,LByteCount);
            finally
              SetLength(LBuffer,0);
            end;
          end else begin
            raise EIdClosedSocket.Create(RSStatusDisconnected);
          end;
        end else begin
          LByteCount := 0;
          if ARaiseExceptionIfDisconnected then
            raise EIdException.Create(RSNotConnected);
        end;
        FClosedGracefully := LByteCount = 0;

peterlepan 12. Jun 2007 23:10

Re: Read Timeout bei Delphi 2007 mit Indy 10
 
Hallo Thomas!

Danke für den Tip, funktioniert prima!

Gruß

Peter

delphin06 16. Jun 2007 17:08

Re: Read Timeout bei Delphi 2007 mit Indy 10
 
Ich hab gar kein Verzeichnis Indy10 im Source Ordner! Wenn ich über Delphi versuche auf den code von IdSSLOpenSSL.pas zuzugreifen, sagt der mir wurde nicht gefunden! Ich hab nur die vorcompilierten dateien davon.
Weiß jemand wo ich den source für die aktuelle Indy 10 version herbekomme?
Nach dem Update ist dieses Problem mit dem timeout immer noch nicht weg!

Pif 12. Aug 2008 00:13

Re: Read Timeout bei Delphi 2007 mit Indy 10
 
Hab das Problem auch, hab gegoogelt etc finde aber keine Lösung.
Erst habe ich die oben genannte Datei auch nicht gefunden. Dann habe ich meine Indy 10 nochmal einem Update von http://indy.fulgan.com unterzogen.
Dort habe ich auch die besagte Datei gefunden, jedoch gibt es in der Zeile die Angegebne Funtion nicht, die ganze Datei enthält nichts davon.

Weiß jemand eine lösung?

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.

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