Dateien über QTcpSocket versenden

Alles rund um die Programmierung mit Qt
Antworten
Nightblizard
Beiträge: 39
Registriert: 7. Oktober 2009 20:32

Dateien über QTcpSocket versenden

Beitrag von Nightblizard »

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):

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();
}
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:

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
}
Die Textdatei ist ein simpler Zweizeiler:

Code: Alles auswählen

2056
test
Kann mir jemand ein wenig unter die Arme greifen? Ich begreife einfach nicht, warum beim Clienten nichts ankommt :cry:


Dankend,
Night
Antworten