Сервер и клиент UDP в Delphi

Я делаю 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;
...
8
задан Darkerstar 5 December 2010 в 15:56
поделиться