私は組み込みWebSocketサーバーを作成し、関連するRFCで直接作業しています。
私のサーバーはブラウザのアップグレード要求に正しく応答し、ブラウザ(サンプルJavaScript)は新しく設定されたソケットを介して短いメッセージを送信し続けます。だからすべてがうまくいきます。
メッセージは短く(全体のフレームはわずか21バイト)、サーバーがデコードできるすべての関連フィールドを含みます。
問題は、ペイロードの長さを含める必要があるビット9〜15にあります。
以下は、WireSharkでキャプチャされたメッセージの16進ダンプです。
81 8f 11 ab d5 0b 5c ce a6 78 70 cc b0 2b 65 c4 f5 78 74 c5 b1
ご覧のとおり、最初のバイトには、FIN(1ビット)、RSVD1(1ビット)、RSVD2(1ビット)、RSVD3(1ビット)、および4ビットのオペコードが含まれています。今まではそんなに良くなった。
8f
問題は、MASKビットとペイロード長が含まれていることです。 MASKビットは1に設定されていてもかまいませんが、フレームの全長が21バイトでペイロード長が15バイトの場合、残りの7ビットの値は71(0x47)です。
それでは、私が何を間違っているのでしょうか?
ペイロードにXORマスクを適用してメッセージをデコードできますが、デコードループを引き継ぎ、15回の繰り返しではなく71回の繰り返しを実行するため、長さは問題です。
答え1
私の構造は、AMD64がビッグエンディアンではなくリトルエンディアンであることを考慮していません。