首先,我在我的安全websocket服务器应用程序上运行valgrind并发现了一个问题(在Qt Memcheck中我必须检查“外部错误”才能看到它) - 某些字节肯定会丢失 - 指向main
我的QCoreApplication::exec()
电话所在的libQt5Core
。在堆栈跟踪中,在调用之后,只有一些Qt库,从libQt5WebSockets
开始,以QWebSocket
结尾。丢失的字节数随着连接数的增加而增加。我仔细检查了我删除了QWebSocketServer::nextPendingConnection()
返回的所有QWebSocketServer
个实例。我也删除QWebSocket
实例。有趣的是,valgrind在运行 sslechoserver demo时也没有报告任何错误,也没有在不安全模式下运行我的服务器(没有SSL)。我不知道这是否是一个实际问题。
其次,更重要的是,我观察到消耗的内存随着每个新连接而不断增加(即使旧连接已关闭且其${flavour}Compile
个实例在我的应用程序和 sslechoserver 演示中删除,实际上大部分时间都有0或1个活动连接。我在Ubuntu上使用 systemmonitor ,在Windows上使用 Windows任务管理器进行观察。在建立了数万个连接后,报告的内存使用量为几十兆字节,而在应用程序生命周期的开始时,它大约为1.5 MB。
我使用Qt 5.5.1和5.6.0(Ubuntu上的GCC,Windows上的MSVC)进行了测试。
我出错了吗? Qt的websockets中有错误吗? sslechoserver 演示是否不正确?
更新我还尝试了 echoserver 演示(没有SSL),消耗的内存也在不断增加。
更新2:我们认为Qt中肯定存在错误。错误报告在这里: https://bugreports.qt.io/browse/QTBUG-53503
答案 0 :(得分:0)
当我们使用express
方法将QTcpSocket
升级到QWebSocket
时,两个套接字都在不同的内存地址上保持活动状态!
换句话说,QWebSocketServer::handleConnection()
充当包装器,并且所有套接字通信都通过基础的QWebSocket
进行。 因此,我们管理的每个1个Web套接字中,还有1个隐藏的TCP套接字。
两个套接字在要销毁时都应使用QTcpSocket
机制处理。
这种情况至少对于从TCP到Web的升级都是正确的。