1

着信 TCP 接続をできるだけ早く受け入れたいと考えています。それでも、データを受信する接続ごとに追加のスレッドが必要です。

ポートをリッスンする TThread クラスは次のとおりです。

procedure TListenThread.Execute;
var
  iSize     : Integer;
begin
  ConnectionAttempts := 0;
  while not (terminated) do begin
    iSize := SizeOf(cAddr);
    hClient := Accept(hServer, @cAddr, @iSize);
    if (hClient <> INVALID_SOCKET) then begin
      inc (ConnectionAttempts);
      SynchIP  := inet_ntoa(cAddr.sin_addr);
      Synchronize(WriteToLog); // Processes very fast!
      with TReceiveThread.Create(TRUE) do begin // This takes the longest...
        FreeOnTerminate   := TRUE;
        hSocket           := hClient;
        TheForm           := aForm;
        Host              := SynchIP;
        Resume;
      end;
    end;
  end;
end;

API のCreateThread処理にかなりの時間がかかることがわかりました。接続をより速く受け入れる方法はありますacceptか (したがって、ListenerThread よりも優先度が高くなります)。

たとえばaccept、2 秒間 (サーバーが約 200 の接続を受け入れた 2 秒間で) 優先順位が最も高くなり、一度に (200) スレッドを作成する、またはそのようなものです。アドバイス、助けていただければ幸いです。

PS .: 接続が発生する前にスレッドを作成したくありません。(これにより、接続が制限され、メモリがいっぱいになります)。また、Indy から離れたいと思います。すでにテストしましたが、同じ速度のようです。

4

1 に答える 1

5

インディの何が悪いの?それは Delphi に同梱されており、そのTIdTCPServerコンポーネントはあなたが求めるすべてのことを行います。リスニング ポートごとに個別のワーカー スレッドを使用して新しい接続を受け入れるため、メイン スレッドは待機しません。受け入れられた各クライアントは、独自のワーカー スレッドで実行されます。また、オプションでクライアント スレッドをプールすることもできます (ご想像に反して、プールは受け入れることができる接続の数を制限する必要はなく、再利用されるのを待機している特定の瞬間にアイドル状態にできるスレッドの数だけです)。

速度に問題がある場合は、遠慮なく Indy の開発者に報告してください。速度の問題は、それ自体の問題ではなく、使用方法に関連している可能性が高いと思います.

于 2013-08-14T20:29:52.737 に答える