Meine Anwendung ist nicht blockierend.
Ich habe gestern erst mal meinen bisherigen Ansatz in einer repeat-Schleife gepackt und den Ablauf etwas geloggt.
Im Eingang in die Methode hat ReceiveLength z.B. 8 ausgegeben.
Drei Zeilen weiter dann ggf. 100.
Also verändert sich der Wert auch schon mal dynamisch.
Until habe ich dann bei "ReceiveLength = 0" veranlasst.
Im Ergebnis holt sich die Behandlung zunächst einen Integerwert für die Streamgröße sobald 4 Bytes verfügbar sind und den Stream selbst sobald dieser komplett verfügbar ist.
So sollte das m.E. ja eigentlich funktionieren - hat es auch.
Aber sobald ich die Logs raus genommen habe lief es wieder nicht mehr.
Da muss wohl irgendwo anders noch ein (Thread-)Problem sein.
In der Nacht um 3 habe ich dann erst mal aufgegeben. :-/
Hier mal der Quelltext (mit dem Logging), der funktionierte.
PS: Ich schaue mir auch Zacherls Hinweis nochmal an, aber ich dachte, meine aktuelle Lösung würde quasi das Gleiche machen...
Delphi-Quellcode:
...Send
MS := TMemoryStream.Create;
lSL.SaveToStream(MS);
MS.Seek(0, soBeginning);
MSSize := MS.Size;
fServerSocket.Socket.Connections[I].SendBuf(MSSize, SizeOf(MSSize));
if fServerSocket.Socket.Connections[I].SendStream(MS)
then
LogSL('
==>', '
', lSL)
else
LogSL('
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==>', '
', lSL);
//==============================================
...
Read
var
iLen: Integer;
Bfr: Pointer;
SL: TStringList;
lP: Int64;
rl: Integer;
iL: Integer;
begin
if fff
then
Codesite.Send('
ffffffffffffffffffffffffffff');
fff := True;
repeat
rl := Socket.ReceiveLength;
Codesite.Send('
Read: ' + IntToStr(rl));
Codesite.Send('
a: ' + IntToStr(Socket.ReceiveLength));
if not Assigned(fMS)
then
begin
Codesite.Send('
not Assigned(fMS)');
if Socket.ReceiveLength >= SizeOf(fMSSize)
then
begin
Codesite.Send('
Socket.ReceiveLength >= SizeOf(fMSSize)');
iL := Socket.ReceiveBuf(fMSSize, SizeOf(fMSSize));
Codesite.Send('
reading=' + IntToStr(
iL));
fMS := TMemoryStream.Create;
end
else
Codesite.Send('
NOT Socket.ReceiveLength >= SizeOf(fMSSize)');
end
else
Codesite.Send('
NOT not Assigned(fMS)');
Codesite.Send('
b: ' + IntToStr(Socket.ReceiveLength));
if Assigned(fMS)
then
begin
Codesite.Send('
Assigned(fMS)');
iLen := Socket.ReceiveLength;
Codesite.Send('
*** ' + IntToStr(iLen) + '
/' + IntToStr(fMSSize));
iLen := Min(fMSSize, iLen);
GetMem(Bfr, iLen);
try
iL := Socket.ReceiveBuf(Bfr^, iLen);
Codesite.Send('
reading=' + IntToStr(
iL));
Dec(fMSSize, fMS.
Write(Bfr^, iLen));
if Socket.ReceiveLength > 0
then
begin
Codesite.Send('
!!!REST');
end;
// lP := fMS.Position;
// fMS.Position := 0;
// SL := TStringList.Create;
// SL.LoadFromStream(fMS);
// SL.Insert(0, IntToStr(SL.Count));
// LogSL('<--', '', SL);
// FreeAndNil(SL);
// fMS.Position := lP;
finally
FreeMem(Bfr);
end;
Codesite.Send('
c: ' + IntToStr(Socket.ReceiveLength));
if fMSSize = 0
then
begin
Codesite.Send('
fMSSize = 0');
fMS.Position := 0;
SL := TStringList.Create;
SL.LoadFromStream(fMS);
SL.Insert(0, IntToStr(SL.Count));
FreeAndNil(fMS);
fMessageHandlerServer.RegisterInSL(SL, Socket);
FreeAndNil(SL);
end
else
Codesite.Send('
NOT fMSSize = 0');
end
else
Codesite.Send('
NOT Assigned(fMS)');
Codesite.Send('
----: ' + IntToStr(Socket.ReceiveLength));
until (Socket.ReceiveLength = 0);
Codesite.Send('
----------------------: ' + IntToStr(Socket.ReceiveLength));
fff := false;
end;