QT tcp socket 注意事项(tcp socket 导致程序崩溃)

F libc : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 in tid 18493 (QThread), pid 18454 (project.example)

或者是

ASSERT: “m_buf” in file

这两个错误
是因为socket 在write的时候, 调用线程和socket创建的线程不一致产生的崩溃
有两种情况
在其他线程调用了write函数,需要通过信号跳转到socket创建的线程调用write(connect信号时添加Qt::QueuedConnection参数),例如:

QObject::connect(this, static_cast<void (Socket::*)(const QByteArray &)>(&Socket::write),
                 this, [=](const QByteArray &byte){
				 if( socket->state() == QTcpSocket::ConnectedState ) {
				 	socket->write(byte.data(), byte.size());
				 }
}, Qt::QueuedConnection);

处理socket的disconnected信号重连时,QObject::connect需要添加Qt::QueuedConnection 参数

QObject::connect(socket, &QTcpSocket::disconnected, this, [=](){
            socket->disconnectFromHost();
            qDebug() << "socket disconnect";

            int time = 0;
            socket->connectToHost(deviceIP, cfg.port);
            while (!socket->waitForConnected(50) && !exit && (time < 20)) {
                socket->connectToHost(cfg.ip, cfg.port);
                time ++;
            }

            if( socket->state() != QAbstractSocket::ConnectedState ) {
            	qDebug() << "socket reconnect fail";
            }
            else {
                qDebug() << "socket reconnect success";
            }
}, Qt::QueuedConnection);
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值