我知道 TCP 保证所有数据包都会到达。但是一个数据包可以分成2个或更多吗?我正在使用 Qt 和 QTcpSocket 类,我想知道的是ReadyRead()
仅当完整数据包到达时才会发出信号。或者换句话说,以第一个字节发送数据包大小,然后循环等待直到所有字节到达是否有任何意义?或者我可以打电话socket->readAll()
我必须得到一整包?
如果发送大量数据,数据包可能会分成不同的部分到达。或者,可以在一个readyRead槽中接收多条消息。
最好的做法是通过将第一个字节设置为将发送的字节数来控制这一点。然后,在readyRead中,您读取第一个字节并将数据附加到缓冲区,直到收到预期的数据量。
在接收数据时,这也意味着如果在一次调用readyRead()中接收到多条消息,您可以知道第一条消息在哪里结束,下一条消息从哪里开始。
以下是客户端在 readRead 函数中接收数据的示例()
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)