draft 00のように、draft 17とそれ以前のバリエーションの両方をサポートする小さなWebSocketサーバーアプリケーションを作成しています。私は最新のドラフトで何の問題もなかったが、ドラフト00のクライアントを幸せにすることはできない。私は公式の(古い)で提供される例を使用し、テストの目的のためにサーバーサイドのドラフト00からWebSocketsハンドシェイク応答
draft 00 docuemnt、7ページ:
Sec-WebSocket-Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8
Sec-WebSocket-Key2: 1_ tx7X d < nw 334J702) 7]o}` 0
Tm[K T2u
数字を連結し、カウントスペースで割ることによって、キーを計算する場合、私は、次の2つの整数を取得:および(これらの2つの数字も文書に記載されています)。
- 文字列で結果を連結し、最後の8ビット(
Tm[K T2u
)を追加 - ビッグエンディアンに個別にそれらを変換します
次に、には言います。
- 私は次のコードを生成しました。この知識で武装し
ステップ1で生成された文字列から128ビットのMD5サムを作成し、2:
#define BYTE 8
#define WORD 16
// Little Endian to Big Endian short
#define LE_TO_BE_SHORT(SHORT)\
(((SHORT >> BYTE) & 0x00FF) | ((SHORT << BYTE) & 0xFF00))
// Little Endian to Big Endian long
#define LE_TO_BE_LONG(LONG)\
(((LE_TO_BE_SHORT(LONG >> WORD)) | \
((LE_TO_BE_SHORT((LONG & 0xFFFF)) << WORD))))
uint num1 = LE_TO_BE_LONG(155712099);
uint num2 = LE_TO_BE_LONG(173347027);
QString cookie = QString::fromUtf8("Tm[K T2u");
QString c = QString::number(num1) + QString::number(num2) + cookie;
QByteArray data = c.toUtf8();
qDebug() << QCryptographicHash::hash(data, QCryptographicHash::Md5);
は、ここで私が得るものです:
を←→»α√r¼??┐☺║Pa♠µ
そして、ここで(ドラフト例に基づいて、再び)期待されているものです
fQJ,fN/4F4!~K~MH
私は、wikipedia articleにエンディアン変換については何も言及していないことに気付きました。私は変換なしで上記のコードを試しましたが(Wikipediaの例とドラフトの例の両方)、期待される結果を再現することはできません。
誰でも問題は何かを指摘できますか?
EDIT:
私はthis documentは、プロトコルのより良い説明を持っていました。別のドラフト(76)ですが、ハンドシェイクの点では00に似ています。
+1ありがとうございました。私もあなたの答えとして答えを追加していました:) – unexplored