QT tcp 客户端收不到数据 QTcpSocket 记录

QT tcp 客户端收不到数据 QTcpSocket 记录,第1张

使用方法1 继承QT thread 重写run

void DataUnpacket::run( )

{

    m_pSocket = new QTcpSocket

    //m_pSocket->socketOption(QAbstractSocket::LowDelayOption)

    QString ip("192.168.112.100")

    ushort portData = 5001

    m_pSocket->connectToHost( ip, portData )

    m_pSocket->waitForConnected()

    if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功

        return

    while( m_bRunning )

    {

        if( m_pSocket->bytesAvailable() >0)

        {

            QByteArray arr = m_pSocket->readAll()//这不进,

            qDebug() <<"recv len =" <<arr.length()

        }

        else

        {

            m_pSocket->write("test",4)

            m_pSocket->flush()// 可以发送出去

            QThread::usleep(1000)

        }

    }

}

方法二 movethred  效果 一样 

方法三 SocketQThread中使用  QtConcurrent::run创建线程, 这个使用QTCreater 调试没有问题,这个也是大坑

打包会出现不能接收到数据或者没发出去, wireshark检测有时会出现现象接收到数据但没发出去

int SocketQThread::InitTest( )

{

    int re = 0

    QString ip("192.168.112.5")

    ushort portData = 5001

    m_pDataPackage.resize(1)

    m_pDataPackage[0] = new DataUnpacket

   if( !m_pDataPackage[0]->InitSocket(ip,portData ) )

       re = -1

    return re

}

void SocketQThread::stratThred()

{

    m_running = true

    for(int i=0i<1i++)//测试

    {

      QtConcurrent::run(this, &SocketQThread::recvDataThread, i )

    }

}

void SocketQThread::stopThred()

{

    m_running = false

    for(int i=0i<1i++)//测试

    {

      m_pDataPackage[0]->CloseFile( )

      m_pDataPackage[0]->tcpDisconnect( )

    }

}

void SocketQThread::recvDataThread( int ch )//暂定

{

    DataUnpacket* pPackage = m_pDataPackage[ch]

    while( m_running )

    {

        if( pPackage->SocketBytesAvailable() >0)

            pPackage->RecvData()

        else

            QThread::usleep(1)

    }

}

类DataUnpacket 继承 Cpackage 如下:

m_Socket为Cpackage的成员变量

int DataUnpacket::RecvData( )

{

    int re = 0

    QByteArray reArr

    QByteArray arr = m_Socket.readAll()

   qDebug() <<"recv len =" <<arr.length()

    #if 0

    m_Socket.write(arr )

    m_Socket.flush()//不加发不出去

#else

    QMetaObject::invokeMethod( &m_Socket, std::bind( static_cast<qint64(QTcpSocket::*)(const QByteArray &) >( &QTcpSocket::write ),&m_Socket, arr ))//, Qt::DirectConnection

    //若加 Qt::DirectConnection ,需要添加m_Socket.flush()/

    return re

}

bool Cpackage::InitSocket(QString&ip, ushort&port )

{

    bool tf = true

    m_Socket.connectToHost( ip, port )

    m_Socket.waitForConnected()

    if( QAbstractSocket::ConnectedState != m_Socket.state() )//判断是否连接成功

        tf = false

    return tf

}

void Cpackage::tcpDisconnect( )

{

    if( m_Socket.state() == QAbstractSocket::ConnectedState)  //关闭时,确保与服务器断开连接

      m_Socket.disconnectFromHost()

}

方法四 QtConcurrent::run(this, &DataUnpacket::RecvDataTest)  这个

void testData::RecvDataTest()

{

    m_pSocket = new QTcpSocket(this)

    //m_pSocket->socketOption(QAbstractSocket::LowDelayOption)

    QString ip("192.168.112.100")

    ushort portData = 5001

    m_pSocket->connectToHost( ip, portData )

    m_pSocket->waitForConnected()

    if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功

        return

    while( m_bRunning )

    {

        if( m_pSocket->bytesAvailable() >0)

        {

            QByteArray arr = m_pSocket->readAll()//这不进,

            qDebug() <<"recv len =" <<arr.length()

        }

        else

        {

            m_pSocket->write("test",4)

            m_pSocket->flush()//可以发送出去

            QThread::usleep(1000)

        }

    }

}

如下例子 是可以的

void testData::RecvDataTest()

{

    qDebug() <<QThread::currentThread()

    QByteArray arr = m_pSocket->readAll()//这不进,

    qDebug() <<"recv len =" <<arr.length()

    m_pSocket->write("test",4)

}

void testData::stratThred( bool tf )

{

    if( tf )

        start()

    else

        exit()

}

void testData::run( )

{

    qDebug() <<"stratThred" <<QThread::currentThread()

    if( nullptr == m_pSocket )

    {

        m_pSocket = new QTcpSocket

        connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(RecvDataTest()), Qt::DirectConnection)

        //m_pSocket->socketOption(QAbstractSocket::LowDelayOption)

    }

    m_pSocket->connectToHost( QString("192.168.112.100"), 5001 )

    m_pSocket->waitForConnected()

    if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功

        return

    //m_pSocket->waitForReadyRead(1000)

    exec()

    m_pSocket->disconnectFromHost()

}

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)

复制


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7914535.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-11
下一篇2023-04-11

发表评论

登录后才能评论

评论列表(0条)

    保存