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;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值