Seite 1 von 1
Qt StandartContainer übers Netzwerk schicken?
Verfasst: 6. Mai 2010 18:12
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
Verfasst: 6. Mai 2010 18:29
von upsala
Debugger? Wireshark? Code?
Verfasst: 11. Mai 2010 13:15
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
Verfasst: 11. Mai 2010 16:10
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
Verfasst: 11. Mai 2010 18:07
von Christian81
Warum der Umweg über das seek() und QByteArray anstatt direkt in das QIODevice zu streamen?