Ben*_*iss 1 delphi vcl winsock delphi-xe4
我希望尽可能快地接受传入的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;
Run Code Online (Sandbox Code Playgroud)
我发现API CreateThread需要很长时间才能处理.有没有办法更快地接受连接(所以accept优先级高于ListenerThread)?
例如,accept具有2秒的最高优先级(在服务器已经接受大约200个连接的2秒内)然后立即创建(200)线程,或类似的东西.建议,帮助将不胜感激.
PS.:我不想在连接发生之前创建任何线程.(这会限制连接并填充内存).我也想远离Indy - 我已经测试了它,它似乎是相同的速度.
Indy有什么问题?它附带Delphi,它的TIdTCPServer组件可以满足您的一切需求.它接受每个侦听端口使用单独的工作线程的新连接,因此主线程不等待.每个接受的客户端都在自己的工作线程中运行 并且可以选择合并客户端线程(尽管您认为,池不必限制您可以接受的连接数,只允许在任何给定时刻等待重用的线程空闲的数量).
如果您遇到速度问题,请随时向Indy的开发人员报告.我怀疑你的速度问题可能与你如何使用它有关,而不是与它本身有关.