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.
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
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); } }
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.
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; ... }
Quelqu'un pourrait-t'il m'éclairer sur l'origine de cette valeur pour le moins fantasque?
Par avance, merci,
Nihi
Partager