Websocket握手Sec-WebSocket-Accept标头值不正确

时间:2016-01-13 22:30:46

标签: javascript c++ websocket

我正在编写一个c ++ websocket服务器,chrome上的dev工具说sec-websocket-accept标头值不正确。我已经测试了几天,一切都很好。尽管在chrome dev工具中显示为101,但是客户端关闭了readystate 3而没有调用websocket onopen。

这是我计算密钥的代码

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");  

Chrome响应中 HTTP / 1.1 101交换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:5T5MvxP1iz40vLpi3kQs / ifDaCo =

Chrome请求
获取ws:// localhost:4897 / echo HTTP / 1.1
主持人:localhost:4897
连接:升级
Pragma:no-cache
缓存控制:无缓存
升级:websocket
来源:http://localhost
Sec-WebSocket-Version:13
User-Agent:Mozilla / 5.0(Windows NT 6.3; WOW64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 47.0.2526.106 Safari / 537.36
Accept-Encoding:gzip,deflate,sdch
接受语言:en-US,en; q = 0.8
Sec-WebSocket-Key:LKF8lHGznbKGIgO1UzAOhg ==
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits

它说&#34; WebSocket握手期间出错:错误&#39; Sec-WebSocket-Accept&#39;标题值&#34;。

Chrome还会显示一个额外的帧,接收大小为79字节的操作码-1。

谢谢堆!

1 个答案:

答案 0 :(得分:4)

Chrome说“Sec-WebSocket-Accept”不正确。尝试手动计算,我不得不同意Chrome。

我的测试:

  1. concat“LKF8lHGznbKGIgO1UzAOhg ==”和“258EAFA5-E914-47DA-95CA-C5AB0DC85B11” =&GT; “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
  5. 粗体值应该相等。如果我在某处错了,请随时纠正我。

    可能出现的问题:

    • sha_str是否以null结尾?即strlen((char*)sha_str) == 20

    • 签名/未签名的char mixup?