ドラフト hixie-76 を使用して Delphi6 で Websocket サーバーを構築しようとしていますが、ハンドシェイクに問題があります。
3つの部分で取得したmd5フィンガープリントは、試してみると正しくないようですが、プロトコル仕様で指定された例で同じアルゴリズムを使用すると、良好なmd5応答が得られます...
私はこのように処理しています.key2と同じように、key1で見つかった数値を32ビットワードのスペース数で割って変換し、最後に最後の8バイト(key3)を追加して、md5エントリとして使用する128ビット文字列を取得します.
key1 と key2 に 155712099、173347027 を使用し、key3 に 'Tm[K T2u' を使用すると、正しい md5 フィンガープリントが取得されるため、このアルゴリズムがクライアントに正しいフィンガープリントを提供しない理由がわかりません
ここに私が受け取るものの例があります:
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8018
Origin: null
Sec-WebSocket-Key1: 4 102(2 6U 2 3 18
Sec-WebSocket-Key2: 69V86`6t)e 0 2 42
M]Rzÿõ&
そして、それに応じて私が与える握手
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://localhost:8018/
µ&Mq˜8èõÙZÙ,hœi
さようなら、私の応答に別の問題があるかもしれませんが、md5 指紋に問題があるようです。
誰かが私の間違いがどこにあるかを見ていますか??
よろしくお願いいたします。
アップデート
私はこのユニットを見たことがありますが、読むのが非常に下手でない限り、このクラスのハンドシェイク部分は md5 合計を計算しません。現在の (76) ではなく、古いバージョンのプロトコルを使用していると思います。
次のコードを見ると、回答が md5 応答なしで書かれていることがわかります。
` try // リクエスト ヘッダーを読み取る HandshakeRequest := TWebSocketRequest.Create(ServerConnection);
// Send response headers
ServerConnection.WriteLn('HTTP/1.1 101 Web Socket Protocol Handshake');
ServerConnection.WriteLn('Upgrade: WebSocket');
ServerConnection.WriteLn('Connection: Upgrade');
ServerConnection.WriteLn('WebSocket-Origin: ' + HandshakeRequest.Origin);
ServerConnection.WriteLn('WebSocket-Location: ws://' + HandshakeRequest.Host + '/');
// End handshake
ServerConnection.WriteLn;
ServerConnection.WriteLn;
HandshakeResponseSent := True;
E を除く: TWebSocketHandshakeException do begin // ハンドシェイクが失敗した場合は接続を閉じます ServerConnection.Disconnect; 終了;`
再度、感謝します
更新 2011 04 14
私はついに問題がどこにあったかを見つけました...
私はそのように私の応答を構築していました:
resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +
したがって、md5フィンガープリントの前に2ではなく3 0x0D 0x0Aがありました...
#13#10#13#10 +
md5response;
私は自分の質問に答えることができないので、解決したとマークすることはできませんが、そうです! :)