I have created a class that wraps the lnet TLTCPComponent to provide a set of functions to simplify Tx/Rx to/from clients.
The "standard" Send function for my server works OK
procedure TDemo.Send(const AValue array of byte)
var
n: integer;
begin
MySocket.IterReset;
while MySocket.IterNext do begin
n := MySocket.Send(AValue[0], Length(AValue), MySocket.Iterator);
end;
end;
As expected this sends the byte arrays to each connected client. So far so good.
The problem I have is when one (or more) of the clients can't accept data at the rate I'm sending it (up to 200kByte per sec, generated in 2kByte chunks). I can't change the clients so need to cope with this problem at the server end.
I'm aware that I need to more towards using the OnCanSend event but I've been unable to find a decent example that works with the server end of the connection.
I believe I can do some thing like the following:
TxBuffer: Array of byte;
P: integer;
procedure TDemo.Send(const AValue array of byte);var n: integer;
begin MySocket.IterReset; while MySocket.IterNext do begin SetLength(TxBuffer, Length(AValue));
Move(AValue[0], TxBuffer[0], Length(AValue)); P := 0;
n := DoOnCanSend(MySocket.Iterator);
end;
end;
Where TxBuffer is used
procedure TDemo.DoOnCanSend(aSocket: TLSocket);var n: integer;
begin repeat begin if (Length(TxBuffer) > 0) and (P < Length(TxBuffer) then begin
n := MySocket.Send(TxBuffer[P], Length(TxBuffer) - P, aSocket);
inc(P, n);
end
end
until (n = 0) or (P >= Length(TxBuffer));
end;
Where I'm struggling is to manage the sending the data to all the connected clients. Do I need to create an instance of TxBuffer for each client?
Suggestions to good server examples welcome!
Dephi Dino.