我们有一个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的补丁程序引起的,该补丁程序导致closesockett®在英特尔至强处理器上永久挂起


通过卸载已经安装的KB4338815,可以解决该问题。因此,请尝试在系统上卸载该KB,然后查看它是否可以解决您的问题。

08-03 13:58