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;