如何快速接受TCP连接并同步我的GUI



我希望尽快接受传入的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秒内具有最高优先级(在这2秒内,服务器已经访问了大约200个连接),然后一次创建(200)个线程,或者类似的事情。建议,帮助将不胜感激。

PS.:我不想在连接发生之前创建任何线程。(这将限制连接并填充内存)。我也想远离印地——我已经测试过了,它似乎也是一样的速度。

Indy怎么了?它与Delphi一起提供,它的TIdTCPServer组件可以满足您的所有要求。它在每个侦听端口使用一个单独的工作线程来接受新的连接,因此主线程不会等待。每个接受的客户端都在自己的工作线程中运行。客户端线程可以选择性地进行池化(不管你怎么想,池不必限制你可以接受的连接数量,只需要限制在任何给定时刻允许有多少线程空闲等待重用)。

如果您有速度问题,请随时向Indy的开发人员报告。我怀疑你的速度问题可能与你如何使用它有关,而不是它本身的问题。

最新更新