百度了tcp的各个状态,看到了 CLOSE_WAIT状态的原因与解决方法(转载留自己看)_编程小生的专栏-优快云博客_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;
}