百度了tcp的各个状态,看到了 CLOSE_WAIT状态的原因与解决方法(转载留自己看)_编程小生的专栏-CSDN博客_close_wait
里面说的close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。
觉得是自己的代码在读取数据时没有判断状态,且程序重新发起重连前没有关闭掉socket。
修改代码 ,后加的代码颜色标注了
void TcpClient::OnReadyRead() { ??? if(client_ && client_->state() == QAbstractSocket::ConnectedState) ??? { ??????? QByteArray data = client_->readAll();
??????? ParseData(data.data(), data.size()); ??? } }
查看代码发现
QBoundTcpSocket *client_;//是TcpClient的成员变量,在重连失败后,释放了new的QBoundTcpSocket ,但没有写析构函数,执行关闭连接的操作。
加上了析构函数
QBoundTcpSocket::~QBoundTcpSocket() { ??? Close(); }
bool QBoundTcpSocket::Close() { ??? disconnectFromHost(); ??? if( sockfd != -1 ) ??? { ??????? applog::LOGGER->Log(applog::kLogError, "QBoundTcpSocket::Close - 1111111111111111111111"); ??????? ::close(sockfd); ??? } ??? applog::LOGGER->Log(applog::kLogError, "QBoundTcpSocket::Close - 2222222222222222222222"); ??? abort();//这里用abort才能把端口释放掉,使用close()是不行的 ??? sockfd = -1; ??? return true; }
|