Dateien über QTcpSocket versenden
Verfasst: 3. April 2010 02:05
Grüsse,
ich versuche eine Datei, oder besser gesagt deren Inhalt, über QTcpSocket von einem Server zu versenden. Bevor das geschieht überprüfe ich eine Versionsnummer, welche ebenfalls vom Server gesendet wird.
Kurz und bündig: Die Versionsnummer wird gesendet, der Inhalt der Datei nicht, obwohl beide Funktionen fast identisch sind!
Das senden der Versionsnummer und des Patches habe ich so geregelt (viel Copy/Pasta aus der Referenz):
Das ist für mich unverständlich, da ich durch verschiedene Ausgaben erfahren habe, dass der block vor dem Senden eindeutig den gewünschten Inhalt beinhaltet!
Die Verarbeitung der im Clienten einkommenden Blöcke:
Die Textdatei ist ein simpler Zweizeiler:
Kann mir jemand ein wenig unter die Arme greifen? Ich begreife einfach nicht, warum beim Clienten nichts ankommt 
Dankend,
Night
ich versuche eine Datei, oder besser gesagt deren Inhalt, über QTcpSocket von einem Server zu versenden. Bevor das geschieht überprüfe ich eine Versionsnummer, welche ebenfalls vom Server gesendet wird.
Kurz und bündig: Die Versionsnummer wird gesendet, der Inhalt der Datei nicht, obwohl beide Funktionen fast identisch sind!
Das senden der Versionsnummer und des Patches habe ich so geregelt (viel Copy/Pasta aus der Referenz):
Code: Alles auswählen
void Server::sendVersionNum() //funktioniert tadellos
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << ver;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
connect(clientConnection, SIGNAL(readyRead()), this, SLOT(sendPatch()));
clientConnection->write(block);
}
//Hier wird ein leerer Block gesendet
void Server::sendPatch()
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
QString patch;
QFile file("version.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
out <<(quint16)0;
}
else
{
QString line;
QTextStream in(&file);
line = in.readAll();
qDebug() << line;
out << 0;
out << line;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
}
clientConnection->write(block);
clientConnection->disconnectFromHost();
}Die Verarbeitung der im Clienten einkommenden Blöcke:
Code: Alles auswählen
void Client::handleBlocks()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
++incs;
if (blockSize == 0)
{
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
{
return;
}
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
{
return;
}
QString nextFortune;
in >> nextFortune;
currentFortune = nextFortune;
neededVer = currentFortune.toInt();
if(neededVer == curVer && incs < 2)
label->setText("UpToDate!");
else if(neededVer != curVer && incs < 2)
{
update(); //Sendet einfach nur eine "1", damit der Server die sendPatch() Funktion aufruft
return;
}
if(incs == 2)
plainTextEdit->setPlainText(currentFortune); //leer! Wird aber aufgerufen
}Code: Alles auswählen
2056
testDankend,
Night