Einzelnen Beitrag anzeigen

Thomas Horstmann

Registriert seit: 25. Apr 2007
Ort: NRW
87 Beiträge
 
Delphi 12 Athens
 
#2

Re: Read Timeout bei Delphi 2007 mit Indy 10

  Alt 12. Jun 2007, 22:18
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;
  Mit Zitat antworten Zitat