900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > qt程序使用tcp连接 客户端退出后 再次重连服务器 一直出现close_wait状态 且无法再连接上

qt程序使用tcp连接 客户端退出后 再次重连服务器 一直出现close_wait状态 且无法再连接上

时间:2019-10-15 04:14:54

相关推荐

qt程序使用tcp连接 客户端退出后 再次重连服务器 一直出现close_wait状态 且无法再连接上

百度了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;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。