Я делаю 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;
...