我有两个QT应用程序。可以认为一个应用程序保存着大数据,并且每秒向第二个应用程序发送大约10 KB的数据块。

早些时候,我尝试使用QUdpSocket传输数据,但是由于MTU限制约为2-5K,并且需要自己分割和重新组合数据,因此我切换到了QTcpSocket。

有时,数据可以通过QTcpSocket正确发送(特别是如果我非常频繁地每隔100毫秒写入一次数据),但有时根本没有发送数据。 5秒后也没有。有时,几个数据块会在内部进行长时间(几秒钟)的缓冲,然后一起发送。

m_socket = new QTcpSocket(this);
m_socket->connectToHost(QHostAddress::LocalHost, 45454);

sendDataEverySec()
{
    QByteArray datagram(10000, 'a');
    qint64 len = m_socket->write(datagram);
    if(len != datagram.size())
           qDebug() << "Error"; //this NEVER occurs in MY case.
    m_socket->flush();
}

在接收方,我使用readyRead信号来知道何时到达数据。

如何确保立即发送数据?对于我想做的事情,还有其他更好的选择吗?

编辑::当我在1秒钟的长时间间隔后进行写操作时,每次发送方发送数据时,我都会在接收方收到"QAbstractSocket::SocketTimeoutError"。如果发件人频繁写入数据,则不会收到此错误。
可以使用QTcpSocket以我的方式流式传输数据吗????

编辑2:在接收方,当readyRead信号发出时,我再次检查while(m_socket->waitForReadyRead(500)),因此我得到了"QAbstractSocket::SocketTimeoutError"。同样,此检查阻止了单个块的交付。
经过更多的文档后,似乎有新数据可用时,readyRead会不断发出,因此不需要waitForReadyRead
我正在接收所有发送的数据,但仍然无法立即获得数据。有时,将两三个块合并。这可能是由于接收器方在读取数据等方面的延迟所致。

最佳答案

在接收器端,当发出readyRead信号时,我再次检查while(m_socket->waitForReadyRead(500)),因此我得到了"QAbstractSocket::SocketTimeoutError"。同样,此检查阻止了单个块的交付。

经过更多的文档之后,当有新数据可用时,readyRead似乎会不断发出,因此不需要waitForReadyRead
它解决了我的问题。

10-08 07:33
查看更多