我有两个QT应用程序。其中一个应用程序可以被认为是持有大量数据的,每秒向第二个应用程序发送约10KB的数据块。
早先我尝试使用QUdpSocket来传输数据,但由于MTU限制约为2-5K,需要自己分割和重组数据,所以我转而使用了QTcpSocket。
有时候使用QTcpSocket可以正确地发送数据(特别是如果我非常频繁地写入数据,大约每100毫秒一次),但有时候根本没有发送数据。即使过了5秒钟也没有。有时几个数据块会在内部缓冲长时间(几秒钟),然后一起发送。
在接收端,我使用
如何确保数据立即发送?有没有更好的替代方案?
编辑:当我间隔1秒钟后再写入时,每次发送者发送数据时,我在接收端都会收到
编辑2:在接收端,当发出
早先我尝试使用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
。
我已经接收到所有发送的数据,但是数据并不会立即到达。有时两三个块会合并。这可能是由于接收端延迟读取数据等原因造成的。