TidHTTPServer触发异常时连接泄漏 调用Disconnect未生效问题咨询
TidHTTPServer SSL连接异常导致连接泄漏解决方案
- 修改异常处理中的断连逻辑
你当前在OnException事件中调用的AContext.Connection.Disconnect;默认是优雅断连,会等待待发送数据传输完成再释放资源,SSL握手失败的场景下没有待发送数据,会导致断连超时,Context长期留在上下文列表中。将断连代码改为强制立即断连即可:
AContext.Connection.Disconnect(True);
参数True表示直接关闭套接字,忽略所有待处理操作,立即触发资源释放。建议补充OnDisconnect事件的日志,确认异常连接是否正常触发了断开事件,方便排查问题。
- 定期清理僵死上下文
可以新增定时任务(如TTimer间隔30秒触发),遍历上下文列表主动清理未激活的连接,避免泄漏累积:
procedure TMain.CleanupStaleConnections; var CtxList: TList; i: Integer; Ctx: TIdContext; begin CtxList := WebService.Contexts.LockList; try for i := CtxList.Count - 1 downto 0 do begin Ctx := TIdContext(CtxList[i]); if not Ctx.Connection.Connected then begin Ctx.Connection.Disconnect(True); CtxList.Delete(i); Ctx.Free; end; end; finally WebService.Contexts.UnlockList; end; end;
- 调整组件超时参数
给TidHTTPServer配置合理的超时阈值,避免半开连接长期占用资源:ConnectTimeout设置为5000(单位毫秒,即握手超时5秒)ReadTimeout设置为30000(读超时30秒)
如果使用的是Indy 10的旧版本,建议升级到最新稳定版,该SSL握手异常导致的上下文泄漏问题已有官方修复。
- 特定异常直接清理
你遇到的Error accepting connection with SSL. EOF was observed that violates the protocol异常属于客户端握手阶段主动断开的场景,捕获到该异常时可以直接将对应上下文从列表中移除,无需等待自动释放。
内容的提问来源于stack exchange,提问作者Wolfgang Bures
相关产品推荐
相关产品推荐

