2013-10-09 164 views
0

我正在使用TCP堆栈的QT实现来控制机器人。我们交换短消息(< 200Byte),往返时间约为8ms。在每个方向上可能有10.000个数据包之后,连接速度变慢,我必须等待大约1秒钟才能收到我的数据包。如果我重新启动我的程序,并重新连接,我再次获得8ms RTT。10.000包后TCP连接速度变慢

对我来说,听起来好像某种缓冲区已经填满了,但我还没有和TCP一起工作过多,所以也许有人会给我一个提示。

+0

你能确定它是否是你的Qt程序,或者它是导致延迟的机器人吗? – RobbieE

+0

当您从接收Tcp连接读取时,是否读取所有缓冲区?如果不是,那么这可能是你的问题。 – TheDarkKnight

+0

@RobbieE:你会如何决定是谁导致问题? – Foo

回答

-2

这只是一个疯狂的猜测,但通过使用qt套接字常见的问题是您需要自己删除套接字对象(例如,使用“deleteLater()”)来处理错误和断开连接。 示例代码:

connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); 

事件循环将然后取下插座的下一个时间,它是能够做到这一点。 QTcpSockets或AbstractSockets不会在close()或离开示波器时删除它们自己(因为那时信号/插槽将不起作用)。

+2

这与这个问题有什么关系? – RobbieE

+0

这是相关的,因为它是一个通常使用QTcpSocket导致内存泄漏的错误。这将解释为什么应用程序在重新启动后自行修复。正如我所说的一个猜测,因为他没有提供代码..也许我应该写在评论而不是答案..(类似的问题在这里:http://stackoverflow.com/questions/11781140/qtcpsocket-qtcpserver-memory-管理服务器崩溃) – TWE

1

问题出在您未显示的代码中。可能在readyRead()上执行的插槽不会清空缓冲区。

  1. 缓冲区不能完全空白,比如说当你读取完整的行/包时,这是可以接受的。

  2. 缓冲区大小不断增长是不可接受的。

在插槽读取插槽的末尾,检查bytesAvailable()是否非零。 #1情况下它只能是非零。即使这样,你也应该能够在它上面设置一个上限 - 比如一些小的数据包大小或者最大线路长度。如果超出范围,则代码中存在错误。

+0

我读取所有可用的数据: – Foo

+0

我读取所有可用的数据: char buffer [socket.bytesAvailable]; socket.read(buffer,socket.bytesAvailable()); bytesAvailable之后是0 – Foo

+0

@Foo:那么你的问题在机器人中。使用wireshark监控线路上正在发生的事情。很可能这个答复很快就会回来。 –