The problem is checking or polling on IOHandler.InputBuffer.Size in TReceiveThread.Execute;
if FParent.FParentClient.IOHandler.InputBuffer.Size > 0 then
Try it this way, the right one
Delphi-Quellcode:
procedure TReceiveThread.Execute;
var
Buffer : TIdBytes;
RecData : TDataRec;
begin
while not Terminated do
begin
if Assigned(FParent) and Assigned(FParent.FParentClient) and FParent.FParentClient.Connected then
begin
FParent.FParentClient.IOHandler.ReadBytes(Buffer, -1, False); // blocks and wait, no need to Ssleep()
if Length(Buffer) > 0 then
begin
RecData.Daten := Buffer;
RecData.Context := Nil;
FDataQueue.Enqueue(RecData);
Inc(Anz, Length(Buffer));
TThread.Queue(nil,
procedure
begin
TForm1(FParent.FForm).Log('Received ' + Length(Buffer).ToString + ' bytes');
end
);
end;
end;
end;
end;
This will fix reading and client is reading everything now, this is a right fix but really the whole code should be refactored better.
About Nagle and it is important : you don't need it if you are sending huge buffers !, just in case sending small packets at very short times frequently, so it will not have an impact on you performing client/server.