- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先,我在我的安全 websocket 服务器应用程序上运行 valgrind 并发现了一个问题(在 Qt Memcheck 中我必须检查 “外部错误” 才能看到它)——一些字节 肯定丢失了 - 指向我的 main
就在我的 QCoreApplication::exec()
调用所在的位置。在堆栈跟踪中,在调用之后,只有一些 Qt 库,以 libQt5Core
开始,以 libQt5WebSockets
结束。丢失的字节数随着建立的连接数而增加。我仔细检查了我是否删除了 QWebSocketServer::nextPendingConnection()
返回的所有 QWebSocket
实例。我还删除了 QWebSocketServer
实例。有趣的是,无论是在运行 sslechoserver 演示还是在不安全模式(无 SSL)下运行我的服务器时,valgrind 都不会报告任何错误。我不知道这是否是一个实际问题。
其次,更重要,我观察到消耗的内存随着每个新连接而不断增加(即使旧连接已关闭并且它们的QWebSocket
实例被删除,实际上大多数时候有 0 或 1 个事件连接)在我的应用程序和 sslechoserver 演示中。我在 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
最佳答案
更新:我怀疑底层QTcpSocket
必须由用户管理。但是,从 Qt 5+ 开始似乎并非如此。请引用:Is the QTcpSocket (or QSslSocket) which underlies a QWebSocket -- destroyed by itself when a socket error happens? .
答案中不正确的部分在下面被划掉了。
当我们使用 QWebSocketServer::handleConnection()
方法将 QTcpSocket
升级为 QWebSocket
时,两个套接字在不同的内存地址上保持事件状态!
换句话说,QWebSocket
充当包装器,所有套接字通信都通过底层 QTcpSocket
进行。 因此,对于我们管理的每 1 个 Web 套接字,还有 1 个隐藏的 TCP 套接字。
两个套接字都应该使用
deleteLater()
机制来处理,当它们打算被销毁时。
这种情况至少对于 TCP 到 Web 的升级是正确的。
关于c++ - QWebSocketServer - 不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296785/
我有一个应用程序,我应该在其中使用 QWebSocketServer 来接受和解析来自 Bokeh 应用程序的一些套接字消息。到目前为止我能够做到这一点,但现在我想将整个 QWebSocketServ
我正在编写一个简单的服务器,它通过 QWebSocketServer 将一些数据传递给 javascript(与 qt doc 基本相同...)。 还有,请看这里: void DebuggerServ
我调试用 C++/Qt 5.12.1 编写的控制台多线程应用程序。它在 Linux Mint 18.3 x64 上运行。 这个应用程序有 SIGINT 处理程序、QWebSocketServer 和
首先,我在我的安全 websocket 服务器应用程序上运行 valgrind 并发现了一个问题(在 Qt Memcheck 中我必须检查 “外部错误” 才能看到它)——一些字节 肯定丢失了 - 指向
我在 Qt5.8 中使用 QWebSocketServer。大多数 WebSocket 客户端都可以轻松连接到它,但其中一个会引发异常行为。 下面是我使用此客户端(客户端 10.8.0.1,服务器 1
我有一个 Qt 应用程序,它使用来自 Letsencrypt 的证书以安全模式 (SSL) 运行 QWebSocketServer。当我从 Windows 10 计算机上的 Chrome 或 Edge
我是一名优秀的程序员,十分优秀!