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