Zitat:
Delphi-Quellcode:
SetLength(bytes,Length(AData));
bytes := BytesOf(AData);
Das SetLength ist sinnlos, da BytesOf ein "vollständiges" dynamisches Array zurückgibt und damit das reservierte Array (der Speicher) von SetLength somit wieder freigegeben.
Beim TMemoryStream oder TBytesStream kann man auch direkt auf den Speicher zugreifen, weswegen man da eigentlich den temp_buffer weglassen könnte.
Delphi-Quellcode:
DataStream.Size := StreamLength;
StreamPosition := 0;
//Received := Client.ReceiveBuf(DataStream.Memory^, StreamLength); // ReceiveBuf wartet nicht bis alles eingetroffen ist, sondern bricht am Ende der Datenpackete ab.
while StreamPosition < StreamLength do begin
Received := Client.ReceiveBuf(PByte(DataStream.Memory)[StreamPosition], StreamLength - StreamPosition);
if Received = SOCKET_ERROR then
Break;
Inc(StreamPosition, Received);
end;
(aus
http://www.delphipraxis.net/176863-b...ml#post1231969)
Statt StreamPosition kann man auch DataStream.Position verwenden, aber ihr wollt nicht wissen wie grauenhaft diesbezüglich der der TMemoryStream implementiert ist,
aber im Normalfall sollte es oftmals nicht groß auffallen.
Delphi-Quellcode:
DataStream.Size := ...;
DataStream.Position := 0;
while DataStream.Position < DataStream.Size do begin
Received := Client.ReceiveBuf(PByte(DataStream.Memory)[DataStream.Position], DataStream.Size - DataStream.Position);
if Received = SOCKET_ERROR then
Break;
DataStream.Position := DataStream.Position + Received;
end;