Qt/OSX WebSocket 打开握手超时

Posted

技术标签:

【中文标题】Qt/OSX WebSocket 打开握手超时【英文标题】:Qt/OSX WebSocket opening handshake timed out 【发布时间】:2017-12-08 16:59:09 【问题描述】:

我刚刚在 Qt 中开发了一个使用 WebSocket 服务器 (QWebSocketServer) 的应用程序。我在 Linux 下执行此操作,一切正常,但是当我在 Mac OS 上运行代码时,我无法从 Chrome 上的网页连接到服务器。

连接需要很长时间,几分钟后我从 Chrome 收到了WebSocket opening handshake timed out

最后我回到了基础,尝试了Qt的例子:

http://doc.qt.io/qt-5/qtwebsockets-sslechoserver-example.html

完全一样。

编辑:

移除 SSL 并使用不安全的 websocket 后,它可以工作,即使在同一个端口上。

Mac 上的 Chrome 可以访问远程(非 Mac)计算机上的安全 Qt WebSocket 服务器,但远程计算机上的 Chrome 在连接到 Mac 时(安全)超时 - 所以它似乎有问题Qt QWebSocketServer 示例。它在 Linux 和 Windows 上都能正常工作。

正在建立连接(因为如果应用程序未运行或关闭,网络浏览器会立即失败),但无论出于何种原因,它都没有完成。

知道这可能是什么,或者我可以如何尝试追踪它吗?

谢谢!

【问题讨论】:

Mac防火墙是否开启? 否 - 我首先检查了 :) 我实际上可以使用 netcat 建立连接,但似乎对发送的任何内容都没有响应。 【参考方案1】:

正如 qt 文档(http://doc.qt.io/qt-5/qsslsocket.html) 所说: 注意:macOS 上的 Secure Transport SSL 后端可能会通过导入本地证书和密钥来更新默认钥匙串(默认可能是您的登录钥匙串)。当您的应用程序使用这些私钥时,这也可能导致系统对话框出现并请求许可。如果不希望出现这种行为,请将 QT_SSL_USE_TEMPORARY_KEYCHAIN 环境变量设置为非零值;这将提示 QSslSocket 使用自己的临时钥匙串。

【讨论】:

【参考方案2】:

这里的问题似乎是与 MacOS 的权限系统的一些交互。

第一次运行应用程序并连接时,应用程序会弹出一个窗口,询问是否有权访问您的钥匙串(我猜是安装证书)。

如果你此时关闭对话框,它就不会回来,而且似乎从那时起,基于 QtWebSocketServer 的程序将无法运行,直到你重新启动!

【讨论】:

以上是关于Qt/OSX WebSocket 打开握手超时的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 连接到“wss://test.example.com:8090/”失败:WebSocket 打开握手超时

WebSocket握手协议

autobahn.twisted.websocket 打开握手错误 400

Websocket 服务器握手响应

如何更改打开 WebSocket 的超时时间?

python之WebSocket协议