Ich konnte in der Zwischenzeit die eigentliche Aufgabe mit dem Senden und Empfangen von RawByteStrings fast lösen, ein kleines Problem bleibt allerdings noch. Und zwar, nur etwa 80% aller vom TIdTCPClient empfangenden Daten konnten wiederverwendet werden. Laut Wireshark wurden alle Daten übertragen, das Problem besteht offfensichtlich daran, die übertragene Daten nicht bzw. nicht richtig voneinander "getrennt" werden. Muss man bei Streams auch irgendwelche Trennzeichen verwenden, um die Datenpackete auseinader zu halten?
Hier mein Code:
Server:
Delphi-Quellcode:
var
mStream: TStream;
begin
for i := Law(arrData) to High(arrData) do
begin
...
mStream := AnsiStringToStream(EncryptString(arrData[i], DataEncryptionKey));
AContext.Connection.IOHandler.Write(mStream, mStream.Size, true);
...
end;
end;
Client:
Delphi-Quellcode:
var
mStream: TMemoryStream;
mStreamData: AnsiString;
begin
while (not Terminated) and (TCPClient.Connected) do
begin
mStream := TMemoryStream.Create;
try
TCPClient.IOHandler.ReadStream(mStream, -1);
mStreamData := DecryptString(StreamToAnsiString(mStream), DataEncryptionKey);
...
finally
mStream.Free;
end;
end;
end;
Delphi-Quellcode:
function AnsiStringToStream(const AString: RawByteString): TStream;
begin
Result := TMemoryStream.Create;
Result.Write(PAnsiChar(AString)^, Length(AString));
Result.Position := 0;
end;
function StreamToAnsiString(const AStream: TMemoryStream): RawByteString;
begin
SetString(Result, PAnsiChar(AStream.Memory), AStream.Size);
end;
Was mache ich falsch?