2016-01-13 58 views
1

我正在編寫一個C++ websocket服務器,在鉻上的開發工具表示sec-websocket-accept標頭值不正確。我已經測試了幾天,這一切似乎都很好。儘管它在chrome開發工具中顯示爲101,但客戶端在readystate 3關閉的情況下沒有調用websocket onopen。Websocket握手Sec-WebSocket-Accept標頭值不正確

這是我的用於計算鍵

string magickey = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 
string key = msgkey.append(magickey); 

unsigned char* sha_str = SHA1(reinterpret_cast<const unsigned char*>(key.c_str()), key.length(), nullptr); 
string acceptkey = base64_encode(reinterpret_cast<const unsigned char*>(sha_str), strlen((char*)sha_str)); 

string handshake_response = "HTTP/1.1 101 Switching Protocols\r\n"; 
handshake_response.append("Upgrade: websocket\r\n"); 
handshake_response.append("Connection: Upgrade\r\n"); 
handshake_response.append("Sec-WebSocket-Accept: "+acceptkey+"\r\n"); 
handshake_response.append("\r\n"); 

鉻響應
HTTP/1.1 101交換協議
升級代碼:網頁套接字
連接:升級
仲丁基的WebSocket - 接受:5T5MvxP1iz40vLpi3kQs/ifDaCo =

Chrome請求
GET ws:// localhost:4897/echo HTTP/1.1
主機:本地主機:4897
連接:升級
附註:無緩存
緩存控制:無緩存
升級:網頁套接字
產地:http://localhost
仲丁基的WebSocket-版本:13
用戶-Agent:Mozilla/5.0(Windows NT 6.3; WOW64)爲AppleWebKit/537.36(KHTML,例如Gecko)鉻/ 47.0.2526.106 Safari瀏覽器/ 537.36
接受編碼:gzip,放氣,SDCH
接受語言:EN-US,EN; Q = 0.8
仲丁基的WebSocket -Key:LKF8lHGznbKGIgO1UzAOhg ==
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits

它說「在WebSocket握手期間錯誤:不正確'Sec-WebSocket-Accept'標頭值」。

Chrome還顯示一個額外的幀接收大小79字節操作碼-1。

謝謝堆!

+0

'acceptkey'的價值是什麼? – Ilya

+0

謝謝,我列出了問題 – xmxmxmx

+0

鍵值你有試過用'\ N',而不是'\ r \ N'?另外,Chrome輸出中的代碼順序看起來不一樣(來自您的代碼)。 – Ilya

回答

2

Chrome表示'Sec-WebSocket-Accept'不正確。試圖手動計算它,我必須同意Chrome。

我的測試:

  1. CONCAT 「LKF8lHGznbKGIgO1UzAOhg ==」 和 「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」 => 「LKF8lHGznbKGIgO1UzAOhg == 258EAFA5-E914-47DA-95CA-C5AB0DC85B11」,這是key
  2. 計算SHA1 160位十六進制:BF15 14e3互相咬合7108 0ee4 7782 c709 A767 cc72 423D e5c4
  3. 從你的日誌,你的編碼爲base64是:5T5MvxP1iz40vLpi3kQs/ifDaCo =
  4. 它進行解碼,以十六進制:e53e 4cbf 13f5 8b3e 34bc ba62 DE44 2cfe 27c3 682A

黑體值應該相等。隨時糾正我,如果我在哪裏錯了。

可能出現的問題:

  • sha_str空值終止?即strlen((char*)sha_str) == 20

  • 符號/無符號字符查詢股價?

+0

aha,我發現這個問題是原始密鑰中的一個空白,所以你指出SHA1是不正確的,socket是開放的,嗚呼!非常感謝。 – xmxmxmx