c++ - 网络套接字握手

标签 c++ websocket handshake

我正在使用 c++ 编写一个 websocket 服务器,我正在等待握手使用 chrome 17 作为客户端。

当服务器向客户端发送握手响应时,chrome 总是在控制台中显示以下错误:

WebSocket 握手时出错:Sec-WebSocket-Accept 不匹配

chrome 中的事件如下:

t=1328796971951 [st= 5]    WEB_SOCKET_SEND_REQUEST_HEADERS  
--> GET / HTTP/1.1   
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:38950
Origin: null     
Sec-WebSocket-Key: zMb+UCeRb+2OmMp9fpbxHw==
Sec-WebSocket-Version: 13

t=1328796971951 [st= 5]    SOCKET_STREAM_SENT     
t=1328796971971 [st=25]    SOCKET_STREAM_RECEIVED  
t=1328796971971 [st=25]    WEB_SOCKET_READ_RESPONSE_HEADERS  
--> HTTP/1.1 101 Switching Protocols
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: 4emBYsdkl0SxeUMGLNc0dFsI1/E=


t=1328796971972 [st=26] -REQUEST_ALIVE

请帮忙。

最佳答案

未正确计算 Sec-WebSocket-Accept 值。

如何计算值(伪代码):

// Getting the Sec-WebSocket-Key from the Request header
var sec_Websocket_Key = requestHeader["Sec-WebSocket-Key"];
// Adding the magic string to sec_Websocket_key
// sha1 hash this new value
var sec_Websocket_Key_Hash = (sec_Websocket-Key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").sha1();
// Get the Base64 String of the hash
var sec_Websocket_Accept = sec_Websocket_Key_Hash.toBase64String();
// sec_Websocket_Accept now is the correct value to set in the Header

获取更多信息here

关于c++ - 网络套接字握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9212793/

相关文章:

SSL认证

SSL 问题 (openssl)

c++ winhttp/wininet 包装器,无需 mfc/atl 即可发布表单和上传文件

c++ - C/C++如何知道动态分配的数组有多长

c++ - 如何在 C++ 头文件和源文件中使用 NumPy C-API?

websocket - 直接 MQTT 与通过 WebSocket 的 MQTT

java - Tomcat 9 和网络套接字。出现 404 错误。我的代码有什么问题?

networking - websocket 可以耗尽网络服务器的连接池吗

mongodb - 由于 x509 证书依赖于旧的 Common Name 字段,因此无法使用 Golang 连接到服务器

c++ - 将 void* 转换到更高的东西的安全方法?