Sind es blocking oder non-blocking Sockets?
Theoretisch ist es möglich, dass die Länge schon nicht in einem Stück ankommt
Das sollte eigentlich bei blocking Sockets nicht passieren. Wenn ich 4 Bytes lese, denn bekomme ich auch 4 Bytes, und nicht 3, 2 oder 1. Allerdings ist das im verlinkten Code tatsächlich etwas komisch umgesetzt, weil da ja erst noch abgefragt wird, wieviele Bytes lesbar sind und dann nur so viel auch gelesen wird. Das läuft dem Konzept von blockierenden Sockets eigentlich zuwider.
Blockierender Ansatz wäre eigentlich so:
Server (wie im Original):
Delphi-Quellcode:
var
lLen: Integer;
lStream: TStream;
begin
lStream := TFileStream.Create('c:\testbild.bmp', fmOpenRead);
lLen := lStream.Size; // grösse Stream ermitteln
Socket.SendBuf(lLen, SizeOf(lLen)); // Grösse senden
Socket.SendStream(lStream); // dann das Bild hinten dran...
end;
Client:
Delphi-Quellcode:
var
lLen: Integer;
lStream: TStream;
Buffer: Pointer;
begin
Socket.RecvBuf(lLen, SizeOf(lLen));
lStream := TFileStream.Create('
c:\testbild.bmp', fmOpenWrite);
// Im einfachsten Fall. Besser wäre es natürlich, einen Buffer fester Größe
// zu erzeugen und mit einer Schleife zu arbeiten, damit der RAM nicht gesprengt wird.
GetMem(Buffer, lLen);
Socket.ReceiveBuf(Buffer^, lLen);
lStream.
Write(Buffer^, lLen);
FreeMem(Buffer);
lStream.free;
end;
Der nicht-blockierende Ansatz wäre so wie Zacherl beschrieben hat.
Wieso genau der Fehler bei dir kommt, weiß ich nicht, aber ich hatte ja schon mal geschrieben, dass blockierend und eventgetrieben sich nicht gut verträgt.