Я делаю UDP C / S. У меня проблема с количеством данных, которые сервер может получать в секунду.
Я проверил отправку на сервер пакетов из 10, 100, 1000 сообщений данных, 10, 100 полученных без проблем. при отправке 1000, только 300 ~ 400 получено. Все тесты сделаны локально.
Я попытался реализовать сервер, используя twsocket ICS и tudpblocksocket от Synapse. Оба оказались с той же проблемой выше.
Не могли бы вы мне объяснить, почему это происходит, и как я могу улучшить производительность сервера.
Код с использованием TUDPBlockSocket
...
while not Terminated do
begin
try
sz := FUDPServer.WaitingData;
if sz > 0 then
begin
FUDPServer.RecvBuffer(mem.Memory, sz);
mem.Seek(0, 0);
AMessage := fFormats.ReadFromStream(mem);
DoMessageReceived(FUDPServer.RemoteSin.sin_addr, AMessage);
end;
finally
end;
end;
...
Код с использованием ICS
...
procedure TShapeServer.WSocketDataAvailable(Sender: TObject; ErrCode: Word);
...
begin
SrcLen := SizeOf(Src);
stream := TMemoryStream.Create;
stream.SetSize(INT_BUFFER_SIZE);
Inc(fMessageReceived);
try
Len := FUDPServer.ReceiveFrom(stream.Memory, stream.size, Src, SrcLen);
if (FSenderAddr.S_addr = INADDR_ANY) or
(FSenderAddr.S_addr = Src.Sin_addr.S_addr) then
begin
while stream.Position < Len do
begin
try
AMessage := fFormats.ReadFromStream(stream);
DoMessageReceived(Src.Sin_addr, AMessage);
except
break;
end;
end;
end;
finally
stream.Free;
end;
end;
...