1

ドラフト 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 +
#13#10#13#10 +
md5response;
したがって、md5フィンガープリントの前に2ではなく3 0x0D 0x0Aがありました...

私は自分の質問に答えることができないので、解決したとマークすることはできませんが、そうです! :)

4

1 に答える 1

1

あなたに答えを与えるかもしれないDelphiのGoogleコードにwebsocketクラスが存在します:

http://code.google.com/p/delphiws/source/browse/trunk/source/uWebSocket.pas?r=4

于 2011-04-08T17:21:54.100 に答える