Morgen Zusammen,
ich möchte eine idTCPServer -idTCPClient Umgebung entwickeln. Diese soll Verschlüsselt sein und
der Transfer soll komprimiert werden. Nun habe ich folgendes Problem, der Verbinungsaufbau zum Server
funktioniert seltsamerweise erst beim zweiten Verbindungsversuch. Beim ersten Versuch gibt immer den Fehler:
Code:
EIdOSSLConnectError mit Meldung 'Error connecting with SSL.
EOF was observed that violates the protocol'
Bei der zweiten Verbindung erhalte ich beim Verlassen der Prozedur noch eine EAccessViolation, welche ich mit
dem Debugger nicht ausmachen kann, weil die Prozedur ja schon beendet ist. Jedoch steht an in der CPU
Ansicht:
Kann einer von Euch erkennen wo mein Fehler liegt, oder wo ich suchen sollte?
Danke und Gruß
Dirk
Delphi-Quellcode:
// Aus dem Formular des Clienten entnommen
object IdTCPClient1: TIdTCPClient
Intercept = IdCompressionIntercept1
IOHandler = IdSSLIOHandlerSocketOpenSSL1
ConnectTimeout = 360000
Host = '127.0.0.1'
IPVersion = Id_IPv4
Port = 211
ReadTimeout = -1
Left = 384
Top = 40
end
object IdCompressionIntercept1: TIdCompressionIntercept
CompressionLevel = 0
Left = 480
Top = 192
end
object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
Destination = '127.0.0.1'
Host = '127.0.0.1'
Intercept = IdCompressionIntercept1
MaxLineAction = maException
Port = 211
DefaultPort = 211
SSLOptions.Method = sslvSSLv23
SSLOptions.SSLVersions = [sslvSSLv2, sslvSSLv3, sslvTLSv1]
SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
Left = 464
Top = 80
end
object LbMD51: TLbMD5
Left = 400
Top = 152
end
Delphi-Quellcode:
// Die benötigten Records, welche ich zum Austausch der Userdaten benötige
unit records;
interface
uses classes;
type ttksuser =
record
username :
string[30];
passhash :
string[100];
end;
type tuserreq =
record
ID: Integer;
fullname :
string[50];
firstname:
string[50];
midlename:
string[50];
checked : integer;
cert :
string;
end;
implementation
end.
Delphi-Quellcode:
// Procedure für den Verbindungsaufbau
procedure TForm8.Button1Click(Sender: TObject);
var
IDMD5:TIdHashMessageDigest5;
aactuser: ttksuser;
arequser: tuserreq;
abuf : tidBytes;
asendstream : tmemorystream;
begin
try
IDMD5:= TIdHashMessageDigest5.create;
IdTCPClient1.Connect;
aactuser.username:='Dirk Piethan';
aactuser.passhash:=LowerCase(IDMD5.HashStringAsHex('TestUser'));
SetLength(aBuf, 0);
abuf := RawToBytes(aactuser, SizeOf(aactuser));
IdTCPClient1.IOHandler.Write(abuf);
SetLength(aBuf, 0);
IdTCPClient1.IOHandler.ReadBytes(aBuf, Sizeof(arequser), false);
BytesToRaw(aBuf, arequser, Sizeof(arequser));
if arequser.checked = -1 then showmessage('Keinen Benutzer angegeben');
if arequser.checked = -2 then showmessage('Keine Password angegeben');
if arequser.checked = -200 then showmessage('Loogin OK');
IDMD5.Free;
SetLength(aBuf, 0);
except
showmessage('Verbindung fehlgeschlagen');
IDMD5.Free;
SetLength(aBuf, 0);
end;
end;