Seite 1 von 1

QTcpSocket readyread Signal wird nicht ausgegeben?

Verfasst: 16. September 2012 12:36
von zerobyte
Hallo,

ich sitze vor einem Problem und komme einfach nicht weiter, vielleicht sehe ich auch den Wald vor lauter Bäumen nicht...
Das Problem ist, bei einer Netzwerkverbindung empfange ich die Größe des folgenden Blocks aber dann wird der Block nicht verarbeitet. Ich kommuniziere von dem Thread zum Mainthread per signal. Bevor Fragen aufkommen,der Code dient nur zur Probe, ob die Kommunikation generell funktioniert. Zur Probe sende ich zuerst 4 Bytes mit der Größe des Blockes und danach 8 Bytes zum testen. Wenn ich alles starte, wird die Blockgröße von 8 im Serverfenster angezeigt, nur dann passiert nichts mehr, er springt nicht in die Schleife in der der Thread gestartet wird und ich weis einfach nicht wieso!

mein readyread signal von dem Socket:

Code: Alles auswählen

void MyClient::readyRead()
{
    bytes = socket->bytesAvailable();
    if(nextBlockSize == 0 && bytes >= 4)
    {
        readnextBlockSize();
        qDebug() << nextBlockSize;
        return;
    }
    if(nextBlockSize != 0 && bytes >= nextBlockSize)
    {
        qDebug() << "Thread start";
        task_receivedata *receivedata = new task_receivedata(socket->read(nextBlockSize));
        receivedata->setAutoDelete(true);
        connect(receivedata,SIGNAL(send_data(QByteArray)),this,SLOT(send(QByteArray)),Qt::QueuedConnection);
        QThreadPool::globalInstance()->start(receivedata);
        nextBlockSize = 0;
        return;
    }
}
das Auslesen der Blockgröße:

Code: Alles auswählen

void MyClient::readnextBlockSize()
{
    QByteArray blocksize(socket->read(4));
    union
    {
        char Blocksizein[4];
        quint32 BlockSizeout;
    } x;
    char *p = x.Blocksizein;
    *p++ = blocksize[0];
    *p++ = blocksize[1];
    *p++ = blocksize[2];
    *p = blocksize[3];
    nextBlockSize = x.BlockSizeout;
}
der Thread im Threadpool:

Code: Alles auswählen

void task_receivedata::run()
{
    qDebug() << empfangen;
    qDebug() << "empfangen";
    senden = empfangen;
    for(long i = 0;i<200;i++)
    {
        i = i + 1;
        i = i - 1;
    }
    emit send_data(senden);
}

und vollständigkeitshalber der Code zum senden des Bytearrays

Code: Alles auswählen

void client::start()
{
    socket->connectToHost("127.0.0.1",
                             1234);
    test.resize(12);
    test[0] = 0x08;
    test[1] = 0x00;
    test[2] = 0x00;
    test[3] = 0x00;
    test[4] = 0x01;
    test[5] = 0x00;
    test[6] = 0x00;
    test[7] = 0x00;
    test[8] = 0x01;
    test[9] = 0x00;
    test[10] = 0x00;
    test[11] = 0x00;
    socket->write(test);
}

Re: QTcpSocket readyread Signal wird nicht ausgegeben?

Verfasst: 16. September 2012 15:55
von Christian81
1. Ist dein Test nicht korrekt. Du solltest warten bis der Socket connected ist (waitForConnected()) und dann mittels flush() sicherstellen dass auch alle Daten verschickt werden.
2. readyRead() wird aufgerufen sobald Daten da sind. Wenn Du nicht alle Daten ausliest ist das Dein Problem. Und das ist genau was Du machst - Du liest die Blocksize und dann hörst Du einfach auf.
3. read() liest nur so viele Daten wie im Socket drin stehen. Wenn weniger als die von Dir übergebene maxAnzahl drin steht dann kommt auch weniger zurück. Das überprüfst Du nicht.

Re: QTcpSocket readyread Signal wird nicht ausgegeben?

Verfasst: 18. September 2012 18:15
von zerobyte
wie gesagt ich hab den wald vor lauter bäumen nicht gesehen ^^ hab da so viel am code immer wieder geändert, da ist das return irgendwie untergegangen... THX.