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