QTcpSocket readyread Signal wird nicht ausgegeben?

Alles rund um die Programmierung mit Qt
Antworten
zerobyte
Beiträge: 18
Registriert: 7. August 2012 11:09

QTcpSocket readyread Signal wird nicht ausgegeben?

Beitrag 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);
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTcpSocket readyread Signal wird nicht ausgegeben?

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
zerobyte
Beiträge: 18
Registriert: 7. August 2012 11:09

Re: QTcpSocket readyread Signal wird nicht ausgegeben?

Beitrag 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.
Antworten