QTcpSocket有时不发送数据

viv*_*k.m 6 qt

我有两个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();
}
Run Code Online (Sandbox Code Playgroud)

在接收器端,我使用readyRead信号来知道数据何时到达.

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

编辑::当我在1秒的长间隙后写作时,"QAbstractSocket::SocketTimeoutError"每次发送者发送数据时,我都会在接收方端收到.如果发件人经常写入数据,则不会收到此错误.
是否可以使用QTcpSocket以我正在做的方式传输数据?

编辑2:在接收器方面,当readyRead发出信号时,我再次检查while(m_socket->waitForReadyRead(500)),因此我得到"QAbstractSocket::SocketTimeoutError"了.此外,此检查阻止了单个块的传递.
经过更多的文档后,似乎readyRead将在新数据可用时不断发出,因此不需要waitForReadyRead.
我收到了所有已发送的数据,但数据仍未立即生效.有时会合并两到三个块.这可能是因为接收方在读取数据等方面的延迟.

viv*_*k.m 2

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

在查看了更多文档之后,似乎当新数据可用时,readyRead将不断发出,因此不需要waitForReadyRead. 它解决了我的问题。