我调试用 C++/Qt 5.12.1 编写的控制台多线程应用程序。它在 Linux Mint 18.3 x64 上运行。
这个应用程序有 SIGINT
处理程序、QWebSocketServer
和 QWebSocket
表。它使用 close()
QWebSocketServer
并为 QWebSocket 中的项目调用
处理终止的表。abort()
/deleteLater()
如果 websocket 客户端连接到此控制台应用程序,则由于某些正在运行的线程(我想它是内部 QWebSocket
线程)而终止失败。
如果没有连接,则终止成功。
如何解决?以便应用程序正常退出。
最佳答案
为了优雅地退出套接字服务器,我们可以尝试:
最重要的部分是让主线程事件循环运行并等待QWebSocketServer::closed()。以便插槽调用 QCoreApplication::quit() .
这甚至可以通过:
connect(webSocketServer, &QWebSocketServer::closed,
QCoreApplication::instance(), &QCoreApplication::quit);
如果我们不需要更详细的 react 。
首先连接该信号后,继续 pauseAccepting()
以防止更多连接。
调用 QWebSocketServer::close
。
如果上面的已经足够,则可能不需要下面的。您需要先尝试上面的,只有当仍然有问题时才处理现有的和挂起的连接。根据我的经验,行为因平台而异,并且在服务器环境中有一些独特的 websocket 实现(这可能只是适合您的 Qt)。
只要我们有一些包含 QWebSocket
实例的数组,我们就可以尝试对所有实例调用 QWebSocket::abort()
以立即释放。这一步好像是题主描述的。
尝试使用 QWebSocketServer::nextPendingConnection() 迭代挂起 连接并为他们调用 abort()
。如果同样有效,请调用 deleteLater
。
关于c++ - 使用连接的套接字终止 QWebSocketServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57221059/