我正在使用TCP堆栈的QT实现来控制机器人。我们交换短消息(<200Byte)并且具有大约8ms的往返时间。在每个方向可能有10.000个数据包之后,连接速度变慢,我必须等待大约1秒才能得到我的数据包的答案。如果我重新启动程序并重新连接,我再次获得8ms RTT。
对我而言,听起来某种缓冲区正在填满,但我没有使用TCP,所以也许有人可以给我一个提示。
答案 0 :(得分:1)
问题在于您未显示的代码。可能在readyRead()
上执行的插槽不会清空缓冲区。
缓冲区不可能是完全空的,比如当你读完整行/包时。
缓冲区大小不断增长是不可接受的。
在您的插槽阅读槽结束时,检查bytesAvailable()
是否为非零。在#1的情况下它只能是非零。即使这样,你也应该能够设置一个上限 - 比如数据包大小或最大行长的一小部分。如果超过了界限,那么您的代码中就会出现错误。
答案 1 :(得分:-2)
这只是一个疯狂的猜测,但使用qt套接字的一个常见问题是你需要自己删除套接字对象(例如使用“deleteLater()”)以便错误和断开连接。 示例代码:
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
然后,事件循环将在下次能够执行时删除套接字。 QTcpSockets或AbstractSockets不会在close()或离开范围时删除它们自己(因为那时信号/插槽将不起作用)。