Paquetes Tcp usando QTcpSocket

Sé que TCP garantiza que todos los paquetes llegarán. ¿Pero se puede separar un paquete en 2 o más? Estoy usando Qt con la clase QTcpSocket, y quiero saber ReadyRead() señal ReadyRead() se emite solo cuando llega el paquete completo. O, en otras palabras, ¿tiene algún sentido enviar el tamaño del paquete en los primeros bytes y luego esperar en el bucle hasta que hayan llegado todos los bytes? O simplemente puedo llamar a socket->readAll() y debo obtener un paquete completo?

Si se envía una gran cantidad de datos, el paquete puede llegar en partes separadas. Alternativamente, se pueden recibir múltiples mensajes en una ranura ReadyRead.

Es una buena práctica controlar esto estableciendo el primer byte (s) en la cantidad de bytes que se enviarán. Luego, en readyRead, lee los primeros bytes y agrega los datos a un búfer hasta que se reciba la cantidad esperada de datos.

Al recibir datos, esto también significa que si se reciben múltiples mensajes en una llamada a readyRead (), puede saber dónde termina el primer mensaje y comienza el siguiente.

Aquí hay un ejemplo de un cliente que recibe datos en una función readyRead ()

 void MyClass::readyRead() { // m_pConnection is a QTcpSocket while(m_pConnection->bytesAvailable()) { QByteArray buffer; int dataSize; m_pConnection->read((char*)&dataSize, sizeof(int)); buffer = m_pConnection->read(dataSize); while(buffer.size() < dataSize) // only part of the message has been received { m_pConnection->waitForReadyRead(); // alternatively, store the buffer and wait for the next readyRead() buffer.append(m_pConnection->read(dataSize - buffer.size())); // append the remaining bytes of the message } QString msg(buffer); // data in this case is JSON, so we can use a QString emit Log(QString("\tMessage Received: %1").arg(msg)); // Do something with the message ProcessMessage(msg); } }