2017-05-23 9 views
0

this postに基づいてQTcpServerを書きました。ソケットは、QByteArrayの合計バイトを最初の4バイト(qint32)に挿入します。QTcpServer - クライアントが奇妙なデータサイズを受信しました

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

サーバー出力:

write_socket sending... 22299 22299 
write_socket true 

はクライアント:すべては罰金

サーバーに見えクライアントで

を、私はループを作り、合計を確認しますサイズ。 合計が到着するまで、受信進みます

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

}

問題:クライアントでを、最初のバイトのサイズは大丈夫そうです。サーバーとクライアントから22299を受信しましたが、ループが停止せず、バッファーサイズが増加します。私は何が欠けているのですか?

クライアント出力:

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

他の時間。物事のようなものがそこに間違っていた。 –

+0

バッファがクリアである必要があります。 –

+0

@ShiheZhangご回答ありがとうございます。問題はスコープに関するものだと私は思う。 –

答えて

0

read_all_bufferは、サーバーの1件の回答のために複数回呼び出されたように見えます。 network_controllerのフィールドにバッファサイズを移動し、network_callbackを放出した後、それをきれいにしてください。

+0

あなたは正しいです!バッファーとサイズをヘッダーに移動しました。その後、私は両方をきれいにしました。なぜこれが起こっているのですか? –

1

SOLUTION:

はどうやら範囲についての何かです。ヘッダーにサイズとバッファーを移動し、データが完成した後にクリアすると問題が解決しました。

ヘッダー:

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

出典:

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

}あなたのコードは二つに行くだろうread_all_buffer`あなたの ``最初time.Butをしませブロックif`で

関連する問題