2017-05-23 13 views
0

this post을 기반으로 QTcpServer를 작성했습니다. 소켓은 처음 4 바이트 (qint32)에 QByteArray의 Q 바이트를 삽입합니다.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가 서버 중 하나 대답을 여러 번 호출 것 같습니다. network_controller 분야에 버퍼 및크기를 이동하고 그 이후 network_callback을 방출 청소하려고.

+0

네가 맞아! 나는 버퍼와 크기를 헤더로 옮겼다. 이 후, 나는 둘 다 청소했습니다. 왜 이런 일이 일어나는거야? –

1

솔루션 :

분명히 범위에 대해 뭔가입니다. 데이터가 완료된 후 크기와 버퍼를 헤더로 이동하고 데이터를 지우면 문제가 해결되었습니다.

헤더 :

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` 당신의``첫 번엔를하지 차단 if`에서