使用qtcsocket的Tcp数据包

使用qtcsocket的Tcp数据包,qt,tcp,Qt,Tcp,我知道TCP保证所有数据包都会到达。但是一个包可以被分成两个或更多个包吗?我将Qt与类qtcsocket一起使用,我想知道只有当完整数据包到达时才会发出isReadyRead()信号。或者换句话说,在第一个字节中发送数据包大小,然后在循环中等待所有字节到达,这有什么意义吗?或者我可以调用socket->readAll(),我必须得到一个完整的数据包?如果发送了大量数据,数据包可以分为不同的部分到达。或者,可以在一个readyRead插槽中接收多条消息 通过将第一个字节设置为将要发送的字节数来控制

我知道TCP保证所有数据包都会到达。但是一个包可以被分成两个或更多个包吗?我将Qt与类qtcsocket一起使用,我想知道只有当完整数据包到达时才会发出is
ReadyRead()
信号。或者换句话说,在第一个字节中发送数据包大小,然后在循环中等待所有字节到达,这有什么意义吗?或者我可以调用
socket->readAll()
,我必须得到一个完整的数据包?

如果发送了大量数据,数据包可以分为不同的部分到达。或者,可以在一个readyRead插槽中接收多条消息

通过将第一个字节设置为将要发送的字节数来控制这一点是一种很好的做法。然后,在readyRead中,读取第一个字节并将数据附加到缓冲区,直到收到预期的数据量

在接收数据时,这也意味着如果在一次readyRead()调用中接收到多条消息,则可以知道第一条消息的结束位置和下一条消息的开始位置

下面是一个在readyRead函数()中接收数据的客户机示例

void MyClass::readyRead()
{
//m_pConnection是一个QTcSocket
而(m_pConnection->bytesAvailable())
{
QByteArray缓冲区;
int-dataSize;
m_pConnection->read((char*)和dataSize,sizeof(int));
缓冲区=m_p连接->读取(数据大小);
while(buffer.size()waitForReadyRead();//或者,存储缓冲区并等待下一个readyRead())
append(m_pConnection->read(dataSize-buffer.size());//追加消息的剩余字节
}
QString msg(buffer);//本例中的数据是JSON,因此我们可以使用QString
发出日志(QString(“\tMessage Received:%1”).arg(msg));
//对这个消息做点什么
处理消息(msg);
}
}

TCP通信是基于流的。在用户模式程序中,您无法访问物理数据包。您需要实现流解析逻辑。例如,如果发送方发送12和34,接收方可能会将它们读取为12 34或1234或1 2 3 4或123 4等。您的程序必须正确处理所有这些情况。只有一个字节可能有点小(只有255个大小),而int则有更多room@ratchetfreak,说得好,当然,这取决于发送的数据,但waitForReadyRead函数在本例中没有预期的效果。函数的文档说明,如果在与readyRead signal连接的插槽中调用waitForReadyRead(),则即使返回true,也不会发送信号@mastash3ff它按预期工作,且文件正确无误。如果从
readyRead
槽中调用,则当
waitForReadyRead
返回true时,
readyRead
槽将不会再次输入。如果它再次进入
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);
    }
}