我知道TCP可以保证所有数据包都能到达,但是一个数据包是否可以被分成两个或更多部分?我正在使用Qt中的QTcpSocket类,我想知道ReadyRead()
信号仅在完整数据包到达时才会发出。换句话说,是否有必要在前几个字节中发送数据包大小并在循环中等待直到所有字节都到达?还是我可以直接调用socket->readAll()
并且我必须获得一个完整的数据包?
我知道TCP可以保证所有数据包都能到达,但是一个数据包是否可以被分成两个或更多部分?我正在使用Qt中的QTcpSocket类,我想知道ReadyRead()
信号仅在完整数据包到达时才会发出。换句话说,是否有必要在前几个字节中发送数据包大小并在循环中等待直到所有字节都到达?还是我可以直接调用socket->readAll()
并且我必须获得一个完整的数据包?
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);
}
}