Delphi-Cross-Socket icon indicating copy to clipboard operation
Delphi-Cross-Socket copied to clipboard

TCrossWebSocket对象已经被释放掉,依然触发了_OnOpenResponse事件导致非法访问的异常。

Open wqmeng opened this issue 1 year ago • 2 comments

当应用退出的时候,释放客户端的websocket,依然会触发OnResponse事件,导致非法访问的异常,此时websocket client对象已经被释放掉了。

First chance exception at $0127D4EC. Exception class $C0000005 with message 'access violation at 0x0127d4ec: read of address 0x00000000'. Process (72684)

报错代码位于 _Lock; 此时 TCrossWebSocket Self 指针已经是不可访问的对象了。并且此时的 FStatus 也已经是非法数据 Out of bound 垃圾的越界值,使用 if (FStatus = wsShutdown) then Exit; 判断,并不能起到实际作用。

不知是我哪里的处理的顺序有问题? 还是什么错误导致?

关闭代码是: __WebSocket.Close; __WebSocket := nil;

procedure TCrossWebSocket._OnOpenResponse(const AResponse: ICrossHttpClientResponse);
var
  LOnOpenResponseEvents: TArray<TWsClientOnOpenResponse>;
  LOnOpenResponseEvent: TWsClientOnOpenResponse;
begin
  if (FStatus = wsShutdown) then Exit;

  _Lock;
  try
    LOnOpenResponseEvents := FOnOpenResponseEvents.ToArray;
  finally
    _Unlock;
  end;

  for LOnOpenResponseEvent in LOnOpenResponseEvents do
    if Assigned(LOnOpenResponseEvent) then
      LOnOpenResponseEvent(AResponse);
end;

Net.CrossWebSocketClient.TCrossWebSocket._OnOpenResponse(TCrossHttpClientResponse($1CAC0BA8) as ICrossHttpClientResponse)
Net.CrossWebSocketClient.TCrossWebSocket.Open$ActRec.$1$Body(TCrossHttpClientResponse($1CAC0BA8) as ICrossHttpClientResponse)
Net.CrossHttpClient.TServerDock.DoRequest[0]$ActRec.$0$Body(TCrossHttpClientResponse($1CAC0BA8) as ICrossHttpClientResponse)
Net.CrossHttpClient.TCrossHttpClientRequest.SendNoCompress[0]$ActRec.$2$Body(TCrossHttpClientResponse($1CAC0BA8) as ICrossHttpClientResponse)
Net.CrossHttpClient.TCrossHttpClientResponse.TriggerResponseFailed(400,'Connection lost')
Net.CrossHttpClient.TCrossHttpClientSocket.LogicDisconnected(TCrossWebSocketClientConnection($9048570) as ICrossConnection)
Net.CrossWebSocketClient.TCrossWebSocketClient.LogicDisconnected(TCrossWebSocketClientConnection($9048570) as ICrossConnection)
Net.CrossSocket.Base.TCrossSocketBase.TriggerDisconnected(TCrossWebSocketClientConnection($9048570) as ICrossConnection)
Net.CrossSocket.Base.TCrossConnectionBase.Close
Net.CrossSocket.Base.TCrossSocketBase.CloseAllConnections
Net.CrossSocket.Base.TCrossSocketBase.CloseAll
Net.CrossSocket.Iocp.TIocpCrossSocket.StopLoop
Net.CrossWebSocketClient.TCrossWebSocketMgr.Destroy
System.TInterfacedObject._Release
System._IntfClear(???)
:007f1537 @IntfClear + $13

wqmeng avatar Nov 17 '24 05:11 wqmeng

请提供能重现问题的工程源码

winddriver avatar Nov 17 '24 12:11 winddriver

发现比较容易出现这个问题的情况就是 一个客户端,一个服务端, 如果服务端没有启动,客户端打开不久就关闭,容易出现这个问题。可能是因为有超时处理,但是此时客户端退出,会出这个异常。

wqmeng avatar Nov 18 '24 09:11 wqmeng