我正在编写一个C++ WebSocket服务器,Chrome上的开发工具指出sec-websocket-accept头部值不正确。我已经测试了好几天,但看起来都没有问题。当客户端以readystate 3关闭而未调用WebSocket onopen时,虽然在Chrome开发工具中显示为101。
以下是我的密钥计算代码:
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 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 5T5MvxP1iz40vLpi3kQs/ifDaCo=
Chrome 请求
GET ws://localhost:4897/echo HTTP/1.1
Host: localhost:4897
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Sec-WebSocket-Key: LKF8lHGznbKGIgO1UzAOhg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
它说“在WebSocket握手期间发生错误:'Sec-WebSocket-Accept'头值不正确。”
Chrome还显示接收到一个额外的帧大小为79个字节,操作码为 -1。
非常感谢!
acceptkey
的值是多少? - Ilya\n
而不是\r\n
吗?此外,从你的代码中,Chrome输出的行顺序似乎有所不同。 - Ilyamsgkey
的值是多少? - Ilya