c++ - 使用连接的套接字终止 QWebSocketServer

标签 c++ qt qthread sigint qtwebsockets

我调试用 C++/Qt 5.12.1 编写的控制台多线程应用程序。它在 Linux Mint 18.3 x64 上运行。

这个应用程序有 SIGINT 处理程序、QWebSocketServerQWebSocket 表。它使用 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/

相关文章:

c++ - 在 Mac 上安装 Kaldi

c++ - 从麦克风到整数数组的音频采样(C++/Qt)

qt - 在 Ubuntu 中使用 QMovie 加载动画 gif 文件

visual-studio-2010 - Qt每500ms中断程序

c++ - 了解 qthread 子类的运行方法和线程上下文

c++ - 从像素标签创建 RGB 图像

c++ - 将数据从调用者线程传递到另一个 boost::thread 中的方法

c++ - 如何迭代通用 vector

c++ - X 显示器的 QDesktopWidget

c++ - 如何使用 c++11 std::thread 实现类 QThread 类?