Qt StandartContainer übers Netzwerk schicken?

Alles rund um die Programmierung mit Qt
Antworten
fatcat
Beiträge: 3
Registriert: 8. November 2009 16:34

Qt StandartContainer übers Netzwerk schicken?

Beitrag von fatcat »

Hi,

ich ärgere mich jetzt schon seit 2 Stunden über, meine Unfähigkeit. Ich schaffs einfach nicht einen QVector<QString> über einen QDataStream(QTcpSocket) an einen QTcpServer zu schicken. Eigentlich muss ich laut examples und Doku ja nur eine Verbindung mit dem Server herstellen, anschließend via QDataStream << QVector<QString> den Vector in den Stream schreiben und am server mit QDataStream >> QVector<QString> wieder auslesen. Hab ich da irgendeinen Denkfehler? Verbindung zum Server klappt problemlos ich bekomme auch keinen Fehler, erst wenn ich am Server den Stream lesen will ist dieser leer. Vielleicht kann mir ja wer helfen.

lg
Stefan
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Debugger? Wireshark? Code?
fatcat
Beiträge: 3
Registriert: 8. November 2009 16:34

Beitrag von fatcat »

Hi,

sorry das ich mich erst jetzt wieder melde. Das mit dem Vector hab ich so halb hingebracht. die Hälfte der Liste ist am Server leider leer angekommen und ich hab keine Ahnung warum aber egal. Ich machs jetzt folgendermaßen:

Code: Alles auswählen

Client methode: wird über signal aufgerufen wenn die Verbindung zum Server erfolgreich war

void LabGbParseWindow::sendAntiSense()
{
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
    out << (quint32)0;
    for(int i=0;i<m_antiSenseVector.size();++i) {
        out << m_antiSenseVector.at(i).toUtf8()+"\n";
    }
    out.device()->seek(0);
    out << (quint32)(block.size() - sizeof(quint32));
    m_socket.write(block);
    m_antiSenseVector.clear();
    m_socket.disconnectFromHost();
    progressSaveStatus->setValue(progressSaveStatus->value()+1);
    QMessageBox::information(this,"Save succeed","Sequence saved successful!");
}

Code: Alles auswählen

Server methode: wird vom signal readready aufgerufen

void LabServer::readData()
{
    QDataStream in(&m_socket);

    if( m_blockSize == 0 )
    {
        if( m_socket.bytesAvailable() < (int)sizeof(quint32) )
            return;

        in >> m_blockSize;
    }

    if( m_socket.bytesAvailable() < m_blockSize ) {
        qDebug() << "Bytes available " << m_socket.bytesAvailable();
        return;
    }
    qDebug() << "Bytes " << m_socket.bytesAvailable();
    QByteArray x;
    in >> x;
    QString r(x);
    qDebug() << r;
}
Das Problem ist nun, dass nach auslesen der Daten nur das QByteArray nur 16 byte lang ist und ich nicht weiß warum, denn die blocksize wird richtig ausgelesen und erst wenn die available Bytes die richtige größe haben wird ausgelesen.

Sieht wer den Fehler?

lg
Stefan
Oliver Hom
Beiträge: 33
Registriert: 27. Mai 2009 12:44

Beitrag von Oliver Hom »

Schau mal bei Goolge Books nach:

C++ GUI Programmierung mit QT 4: Die offizielle Einführung
Von Jasmin Blanchette,Mark Summerfield

Ab Seite 461 ist dein Beispiel beschrieben mit der Blockübertragung. Ist dort allerdings etwas anders gelöst.

Gruß,
Oliver
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warum der Umweg über das seek() und QByteArray anstatt direkt in das QIODevice zu streamen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten