我正在使用TCP堆栈的QT实现来控制机器人。我们交换短消息(< 200Byte),往返时间约为8ms。在每个方向上可能有10.000个数据包之后,连接速度变慢,我必须等待大约1秒钟才能收到我的数据包。如果我重新启动我的程序,并重新连接,我再次获得8ms RTT。10.000包后TCP连接速度变慢
对我来说,听起来好像某种缓冲区已经填满了,但我还没有和TCP一起工作过多,所以也许有人会给我一个提示。
我正在使用TCP堆栈的QT实现来控制机器人。我们交换短消息(< 200Byte),往返时间约为8ms。在每个方向上可能有10.000个数据包之后,连接速度变慢,我必须等待大约1秒钟才能收到我的数据包。如果我重新启动我的程序,并重新连接,我再次获得8ms RTT。10.000包后TCP连接速度变慢
对我来说,听起来好像某种缓冲区已经填满了,但我还没有和TCP一起工作过多,所以也许有人会给我一个提示。
这只是一个疯狂的猜测,但通过使用qt套接字常见的问题是您需要自己删除套接字对象(例如,使用“deleteLater()”)来处理错误和断开连接。 示例代码:
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
事件循环将然后取下插座的下一个时间,它是能够做到这一点。 QTcpSockets或AbstractSockets不会在close()或离开示波器时删除它们自己(因为那时信号/插槽将不起作用)。
问题出在您未显示的代码中。可能在readyRead()
上执行的插槽不会清空缓冲区。
缓冲区不能完全空白,比如说当你读取完整的行/包时,这是可以接受的。
缓冲区大小不断增长是不可接受的。
在插槽读取插槽的末尾,检查bytesAvailable()
是否非零。 #1情况下它只能是非零。即使这样,你也应该能够在它上面设置一个上限 - 比如一些小的数据包大小或者最大线路长度。如果超出范围,则代码中存在错误。
你能确定它是否是你的Qt程序,或者它是导致延迟的机器人吗? – RobbieE
当您从接收Tcp连接读取时,是否读取所有缓冲区?如果不是,那么这可能是你的问题。 – TheDarkKnight
@RobbieE:你会如何决定是谁导致问题? – Foo