J'ai l'extrait de code suivant dans le corps d'une boucle responsable de la lecture des données d'un QTcpSocket (nntp est un pointeur vers un QTcpSocket).Pourquoi mon code ne peut-il pas lire le nombre d'octets disponibles sur un QTcpSocket? Des idées?
std::vector<char> buffer;
int bytesAvailable = nntp->bytesAvailable();
qDebug() << "bytesAvailable: "<<bytesAvailable;
if(bytesAvailable <= 0) break;
buffer.resize(bytesAvailable);
bytesRead = nntp->read(&buffer[0], bytesAvailable);
qDebug() << (nntp->state() == QAbstractSocket::ConnectedState);
qDebug() << "bytesRead: "<<bytesRead;
Intermittences cette commande affiche quelque chose de semblable à ce qui suit:
bytesAvailable: 24
true
bytesRead: 0
Et mon code de là mis-se comporte. Cela me semble très étrange et suggère que je me méprends complètement sur le fonctionnement de QTcpSockets. Sûrement si bytesAvailable> 0 alors une lecture subséquente signifiera que bytesAvailable octets peuvent être lus dans un tampon auquel cas bytesRead devrait == bytesAvailable. Ou est-ce que je manque quelque chose? Mon soupçon actuel est qu'il pourrait s'agir d'une corruption de mémoire.
EDIT: L'envoi dans certains messages nntp.errorString() signale que, lors de cet incident, le message "Expiration du réseau a expiré". J'ai besoin d'étudier ce que cela signifie ... (idées?)
EDIT 2: Il semble que "L'opération réseau a expiré" signifie simplement que la lecture a expiré. Lorsque le code fonctionne comme il le devrait (c'est-à-dire par intermittence), je reçois toujours cette 'erreur'.
EDIT 3: Le contexte algorithmique complet pour l'extrait de code ci-dessus peut être trouvé at this pastebin link.
EDIT 4: Une version légèrement différente de la fonction EDIT 3, mais toujours avec les mêmes problèmes sont néanmoins à this newer pastebin link
Je n'aime vraiment pas cette construction: '& buffer [0]'. Au lieu de cela, essayez 'buffer = nntp-> readAll();'. – Amartel
Merci pour votre suggestion Amartel mais en passant à un QByteArray et ensuite faire un readAll, puis en utilisant la taille de la QByteArray pour déterminer le nombre d'octets lus encore entraîne le même problème –