我想尽可能快地接受传入的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 - 我已经测试了它,它似乎速度相同。
答案 0 :(得分:5)
Indy出了什么问题?它附带Delphi,它的TIdTCPServer
组件可以满足您的所有需求。它接受每个侦听端口使用单独的工作线程的新连接,因此主线程不等待。每个接受的客户端都在自己的工作线程中运行并且客户端线程可以选择合并(尽管您认为,池不必限制您可以接受的连接数,只允许在任何给定时刻等待重用的空闲线程数。)
如果您遇到速度问题,请随时向Indy的开发者报告。我怀疑你的速度问题可能与你如何使用它有关,而不是与它本身有关。