2017-05-23 9 views
0

J'ai écrit mon QTcpServer basé sur this post. Le socket insère le nombre total d'octets de QByteArray sur les 4 premiers octets (qint32). Tout semble bienQTcpServer - Client recevant des données de taille étrange

Serveur:

static inline QByteArray IntToArray(qint32 source); 

QByteArray IntToArray(qint32 source) { 
    QByteArray temp; 
    QDataStream data(&temp, QIODevice::ReadWrite); 
    data << source; 
    return temp; 
} 

void multisocket::write_socket(const QJsonObject &obj){ 
    QJsonDocument doc(obj); 
    QByteArray array(doc.toJson()); 
    qint32 size = array.size(); 
    qDebug() << "sending..." << size << array.size(); 

    QByteArray total = IntToArray(size); 
    socket->write(total); 
    socket->write(array); 
    qDebug() << socket->waitForBytesWritten(); 
} 

Output Server:

write_socket sending... 22299 22299 
write_socket true 

Client:

Sur le client, je fais une boucle et vérifier le total Taille. Jusqu'à ce que la réception de procéder total est arrivé:

static inline qint32 ArrayToInt(QByteArray source); 

void network_controller::read_all_buffer(){ 
QByteArray buffer; 

qint32 size = 0; 

while (s->bytesAvailable() > 0) 
{ 
    buffer.append(s->readAll()); 

    while ((size == 0 && buffer.size() >= 4) || 
      (size > 0 && buffer.size() >= size)){ 

     if (size == 0 && buffer.size() >= 4) 
     { 
      size = ArrayToInt(buffer.mid(0, 4)); 
      buffer.remove(0, 4); 
     } 

     if (size > 0 && buffer.size() >= size) 
     { 
      QByteArray data = buffer.mid(0, size); 
      QJsonObject obj = socket_ba_to_json(data); 
      emit network_callback(obj); 
     } 
    } 
    } 

}

Le problème: Sur le client, la taille des premiers octets semble ok. J'ai reçu 22299 du serveur et du client, mais la boucle ne s'arrête pas et la taille de la mémoire tampon augmente. Qu'est-ce qui me manque?

Sortie client:

read_all_buffer Receiving: 22299 1460 
read_all_buffer Receiving: 538976288 8760 
read_all_buffer Receiving: 538976288 4380 
read_all_buffer Receiving: 808192544 1460 
read_all_buffer Receiving: 538976288 2920 
read_all_buffer Receiving: 1381979713 3323 
+0

Dans votre 'read_all_buffer' votre code iriez dans les deux' if' bloquer le premier time.But pas À d'autres moments, on dirait que les choses ont mal tourné. –

+0

Peut être le tampon doit être clair. –

+0

@ShiheZhang Merci pour votre réponse. Le problème était quelque chose à propos de la portée, je pense. –

Répondre

0

Il ressemble read_all_buffer est appelé à plusieurs reprises pour une réponse du serveur. Essayez de déplacer tampon et taille dans les champs de network_controller et le nettoyer après émette network_callback.

+0

Vous avez raison! J'ai déplacé le tampon et la taille à l'en-tête. Après cela, j'ai nettoyé les deux. Pourquoi cela se passe-t-il? –

1

LA SOLUTION:

Apparemment, quelque chose au sujet de la portée. Le déplacement de la taille et du tampon vers l'en-tête et l'effacement après la fin des données ont résolu le problème.

L'en-tête:

private: 
void write_socket(QJsonObject obj); 
QByteArray buffer; 
qint32 size; 

Source:

void network_controller::read_all_buffer() 
{ 
    while (s->bytesAvailable() > 0) 
    { 

    buffer.append(s->readAll()); 

     while ((size == 0 && buffer.size() >= 4) || 
      (size > 0 && buffer.size() >= size)) 
     { 
     if (size == 0 && buffer.size() >= 4) 
     { 
      size = ArrayToInt(buffer.mid(0, 4)); 
      buffer.remove(0, 4); 
     } 

     if (size > 0 && buffer.size() >= size) 
     { 
      QByteArray data = buffer.mid(0, size); 

      QJsonObject obj = socket_ba_to_json(data); 
      size = 0; 
      buffer = QByteArray(); 
      emit network_callback(obj); 
     }   
    } 
} 

}