Salut à tous!
Voilà, je suis en train de me faire un petit updater histoire de rendre mes distributions pérennes dans le temps. Toute la partie de test de fichiers, détermination de la similitude entre le fichier client et le fichier serveur via Md5 et Sh4 est fonctionnelle (revue, testée, validée, mangée, recrachée, etc), et je me retrouve donc avec une QStringList contenant le nom des fichiers à envoyer du serveur au client. Le code que je fait suivre concerne uniquement la partie émission-réception du fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Server.cpp
void Server::sendFile(QStringList &files, QString ClientPath)
{
    if (indexDL < files.size())
    {
        QByteArray paquet;
        QDataStream out(&paquet, QIODevice::WriteOnly);
        out << quint32(0); // On écrit 0 au début du paquet pour réserver la place pour écrire la taille
        //Ouverture du fichier
        QFile fileReading(ClientPath+files[indexDL]);
        if (fileReading.open(QIODevice::ReadOnly))
        {
            out << (quint16) QString("1111").toInt(0 , 16); //On insère la balise
            out << fileReading.readAll();//On ajoute le contenu du fichier
        }
        else
            out << (quint16) QString("1110").toInt(0 , 16);//On insère une balise d'échec
        fileReading.close();
 
        out.device()->seek(0); // On se replace au début du paquet
        out << quint32(paquet.size() - (sizeof(quint16)+sizeof(quint32))); // On écrase le 0 qu'on avait réservé par la longueur du message
        // Envoi du message au client
        m_TcpSocket->write(paquet, paquet.size());
        indexDL++;
    }
    else
    {
        QByteArray paquet;
        QDataStream out(&paquet, QIODevice::WriteOnly);
        out << (quint32) 0; // On écrit 0 au début du paquet pour réserver la place pour écrire la taille
        out << (quint16) QString("1112").toInt(0 , 16); //On insère la balise de fin de téléchargement
        out.device()->seek(0); // On se replace au début du paquet
        out << (quint32) (paquet.size() - (sizeof(quint16)+sizeof(quint32))); // On écrase le 0 qu'on avait réservé par la longueur du message
        // Envoi du message au client
        m_TcpSocket->write(paquet);
    }
}
Et maintenant le client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Client.cpp
void Client::serverRece()
{
    quint16 balise;
    QByteArray dataBA;
    quint32 messageSizeDL=0;
    // Même principe que lorsque le serveur reçoit un paquet : On essaie de récupérer la taille du message Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annoncée messageSizeDL)
    QDataStream in(socket);
    if (messageSizeDL == 0)
    {
        if (socket->bytesAvailable() < sizeof(quint32))
            return;
        in >> messageSizeDL;
    }
    if (socket->bytesAvailable() < messageSizeDL)
       return;
    // Si on arrive jusqu'à cette ligne, on peut récupérer le message entier
    in >> balise;
    in >> dataBA;                
    statusQPB->setValue(dataBA.size()+statusQPB->value());
    messageSizeDL = 0;
    ...
}
Là où tout cela devient bizarre, c'est qu'au premier fichier, tout fonctionne comme il faut. Mon fichier est écrit au bon endroit, avec le bon contenu (à savoir, dataBA que j'utilise plus loin dans la méthode, mais que je n'ai pas montré ici). En revanche, au second fichier, messageSizeDL prend une valeur de 286261248 au lieu du 13 lié à la longueur de mon fichier test! Et après avoir poussé un peu plus mes tests, je me suis aperçu que cela ne dépendait pas du fichier envoyé, mais simplement du fait qu'il soit le 2ème.

Quelqu'un pourrait-t'il m'éclairer sur l'origine de cette valeur pour le moins fantasque?

Par avance, merci,

Nihi