evpp icon indicating copy to clipboard operation
evpp copied to clipboard

当服务器主动断开连接的时候,已连接的TCPClient资源和释放?

Open aijyo opened this issue 4 years ago • 3 comments

如题: 当服务器主动断开连接的时候,TCPClient OnConnection 函数中收到 Disconnecting的消息, 如果在这个事件之后调用Disconnect (在本次loop中调用,或QueueInLoop之后调用)函数的话,由于conn_已经断开连接了,不管这个时候conn_是否非空,在TCPClient::DisconnectInLoop中都会触发assert。如果不主动调用TCPClient::Disconnect的话,那么TCPClient 在析构的时候assert(!connector_.get()); 会触发。而connector_只能在TCPClient::DisconnectInLoop被重置为空。

所以问题是: 当服务器主动断开连接的时候,已连接的TCPClient资源和释放?

(TCPCLient的析构函数中的assert(!connector_.get()); 意味着必须调用TCPClient::Disconnect函数,而在服务器主动断开连接之后,客户端没法找到合适的时机去调用DisConnect函数,因为不管是在conn_ reset之前 还是 reset之后调用DisConnect都会在TCPClient::DisconnectInLoop中都会触发assert)

aijyo avatar May 05 '20 08:05 aijyo

顶一下,我们现在也遇到了类似的问题,希望有人解答一下

Phymin avatar Jun 12 '20 02:06 Phymin

顶一下,我们现在也遇到了类似的问题,希望有人解答一下

我说下自己的解决方案吧,我最后改了evpp源码, tcp_client.cc文件, 大概是这两处地方,我目前在我自己使用的范围内没fa发现这个改动有啥大问题,你可以试试,还有就是这个框架基本上都是各种异步,建议自己业务相关的代码 多 enable_shared_from_this. image

image

aijyo avatar Jun 12 '20 03:06 aijyo

我也去试试,谢谢!

Phymin avatar Jun 12 '20 03:06 Phymin