我们有一个Indy(版本10.6.1.5235)TIdHttpServer“服务”,它在Delphi 2007中已经运行了好几年。在最新的Windows Update(KB4338815和KB4338830)之后,我们注意到当TIdHttpServer设置为false时,该服务将冻结。
我已包含创建TIdHttpServer的源代码。在我们的服务“停止”处理程序中,我们将IdHttpServer1.Active设置为False,这就是冻结的地方。似乎Indy尝试关闭http连接时挂起。有没有解决的办法?
每个Remy Lebeau更新一次,我创建了一个最小,完整和可验证的示例。这里是:
procedure TMainForm.Button1Click(Sender: TObject);
begin
memo1.clear;
iCall := 0;
IdHTTPServer1 := TIdHTTPServer.Create;
IdHTTPServer1.MaxConnections := 10;
IdHTTPServer1.AutoStartSession := True;
IdHTTPServer1.SessionState := True;
IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet;
IdHTTPServer1.KeepAlive := False;
idHttpServer1.DefaultPort := 80;
if ReuseSocket.checked then
IDHTTPSERVER1.ReuseSocket := rsTrue;
IdHTTPServer1.Active := True;
end;
procedure TMainForm.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
iCall := iCall + 1;
if iCall mod 100 = 0 then
memo1.lines.add(inttostr(iCall)+ ' calls made');
AResponseInfo.ContentText := '<html><body>Hello There</body></html';
end;
procedure TMainForm.StopClick(Sender: TObject);
begin
try
IdHTTPServer1.Active := False;
memo1.lines.add('IdHTTPServer1.Active := False;');
except
on e: exception do
memo1.lines.add('Exception on IdHTTPServer1.Active := False; Message:'+e.message);
end;
end;
应用程序将正常运行,但是一旦您单击“ Stop”按钮(将IdHttpServer Active属性设置为False),它就会挂起。
最佳答案
您可能遇到过类似的问题:
Windows 2012 R2 closesocket() hangs on listening socket
该问题是由Microsoft KB4338815的补丁程序引起的,该补丁程序导致closesocket
t®在英特尔至强处理器上永久挂起
通过卸载已经安装的KB4338815,可以解决该问题。因此,请尝试在系统上卸载该KB,然后查看它是否可以解决您的问题。