2

を使用した WebSocket 接続の確立に問題がありQWebSocketます。Qt 5.6 とそのQWebSocket実装を使用しています。サーバーは正しく動作し、WS v13プロトコルを使用していると確信しています。すべてのブラウザで正常に動作します。errorサーバーに接続しようとすると、QWebSocket がstateChangedこれらのメッセージを出力して通知します (errorString()メソッドを使用して取得します)。

QWebSocketPrivate::processHandshake: Connection closed while reading header.
Invalid statusline in response: Upgrade: websocket
Invalid statusline in response: Connection: Upgrade
Invalid statusline in response: Sec-WebSocket-Accept: HLaITyncgax+CH7OUIXnsCfFDDY=
Invalid statusline in response: // there's a carriage return symbol

と表示されていますがConnection closed while reading header、実際には接続は閉じられていません (サーバーがしばらくして websocket を介して追加のパケットを送信するため)。websocket.org のエコー テストでアプリケーションをテストしたところ、問題なく動作しました。しかし、両方の試行でパケットを盗聴しましたが、大きな違いは見つかりませんでした。

接続しようとしているサーバーでのパケット スニッフィングの結果:

GET / HTTP/1.1
Host: <hostname>:6670
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: WcIsYc1AZ6CKikXFwGXgMg==
Origin: http://<hostname>
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Connection: keep-alive, Upgrade


HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 7lfSGmSz/eW1mSzaMnuzOqg00w4=

との接続でのパケット スニッフィングの結果echo.websocket.org:

GET / HTTP/1.1
Host: echo.websocket.org:80
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: MUAZoP0Ef4KSWkmtsB5YDw==
Origin: http://<hostname>
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Connection: keep-alive, Upgrade


HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://<hostname>
Connection: Upgrade
Date: Thu, 31 Mar 2016 12:05:49 GMT
Sec-WebSocket-Accept: c4yAe+A1VRuhF1LSC/TGgPoa8N4=
Server: Kaazing Gateway
Upgrade: websocket

<data exchange goes here normally>

問題を調査して解決するにはどうすればよいですか? サーバーにアクセスできません。

PS はい、私はQTBUG-40878を認識しています。これは Qt 5.3.1 に影響しますが、私は 5.6.0 を使用しており、Qt セットアップで明らかに修正されています。

4

1 に答える 1

2

これはQTBUG-51069である可能性があります(これはあなたが言及したものではありません):

ステータス ライン ("HTTP/1.1 101 Upgrading Protocol") とヘッダーの間に遅延がある場合、QWebSocketPrivate::processHandshake はサーバーの切断を誤って検出します。問題は、実際のソケット状態ではなく、データが利用可能かどうかをチェックするだけの QAbstractSocket::atEnd 関数を使用して切断状態がチェックされることです。これにより、複数のエラー信号が発生します。

websocket error: QWebSocket::processHandshake: Connection closed while reading header.
websocket error: Invalid statusline in response: Date: Thu, 11 Feb 2016 20:07:37 GMT^M .
websocket error: Invalid statusline in response: Server: WSGIServer/0.1 Python/2.7.10^M .
websocket error: Invalid statusline in response: Upgrade: websocket^M .
websocket error: Invalid statusline in response: Connection: Upgrade^M .
websocket error: Invalid statusline in response: Sec-WebSocket-Accept: oQ+NK56UdGrsXFisB9chjE3SU+Y=^M .
websocket error: Invalid statusline in response: Sec-WebSocket-Version: 13^M .
websocket error: Invalid statusline in response: Content-Length: 0^M .
websocket error: Invalid statusline in response: ^M .

修正は Qt 5.6.2 にあります。

Qt 5.7 については、コミット履歴から判断すると 5.7.1 になると思います。

于 2016-09-05T07:32:25.667 に答える