みなさん、こんにちは。よろしくお願いします。
RFC 6455 に従って、C++ で独自の WebSocket サーバーを展開しています (ここで何が起こっているかを再確認するために、今朝 C# でもすばやく展開しました)。
私は標準を読み、クライアントとの接続を正常に形成するサーバーを手に入れました。ハンドシェイクを完了し、相手側で適切に受信された単純なテスト クライアントからデータを送信できます。
FireFox/JS を使用してサーバーへのデータ送信をテストしているときに、サーバー側で文字化けしたシンボルが多数表示されます。WireShark でソケットを監視し、サーバーがデータを正しく受信していることを確認しましたが、解釈に問題があります。
文字列「test」(引用符なし)をサーバーに送信しようとしていますが、最後の試行は次のように表示されました:
0x81
0x84
0x1e
0x31
0x65
0xaf
0x6a
0x54
0x16
0xdb
これらのほとんどは印刷可能な文字でさえありません。[これらの値を送信] をクリックするたびに変更されます (常に最初の文字である場合を除きます0x81
) 。0x00
0xFF
FireFoxs ハンドシェイク リクエストでは、次のように Accept-Encoding を指定します。
Accept-Encoding: gzip, deflate
ただし、GZIP と DEFLATE の両方で解凍しようとしましたが、どちらもエラーをスローします。また、Lorem Ipsum をサーバーに送信しようとしましたが、同じ結果が得られました (0x81 の後に文字のマッシュが続きます)。
誰でもこれに光を当てることができますか?これは本当に圧縮されていますか?同じ文字列を送信しても毎回異なる結果になるのはなぜですか? FireFox は送信データにタイムスタンプを付けますか? 私が望むのは、サーバー側で文字列を正しく解釈して「テスト」に戻すことだけです
FireFox からの完全なリクエストは次のとおりです。
GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: lXen8aJPlv/0JOZBb4WAtA==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
そして、これが私のサーバーの完全な返信です:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: WHTW6PSJ/pWIPskBw0owBT/jacw=
これは成功し、javascript の最後でも OPEN を取得し、ボタンをクリックして send("test") を呼び出すと、上記のコードの最初のブロックに示されているゴミを受け取ります...