C++ WebSocket 服务器实现(接受密钥不匹配)

Posted

技术标签:

【中文标题】C++ WebSocket 服务器实现(接受密钥不匹配)【英文标题】:C++ WebSocket Server Implementation (Accept Key missmatch) 【发布时间】:2013-02-26 19:05:55 【问题描述】:

我尝试搜索但没有找到任何答案。 我正在用 c++ 制作一个 websocket 服务器,但我无法让接受密钥工作。

这是我的代码:

std::string magicKey = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key.append(magicKey);   
unsigned char* sha_str = SHA1(reinterpret_cast<const unsigned char*>(key.c_str()), key.length(), nullptr);
std::string final = base64_encode(reinterpret_cast<const unsigned char*>(sha_str), strlen((char*)sha_str));

我正在使用 openssl/sha.h

【问题讨论】:

【参考方案1】:

你是否在末尾连接“=”?

等价的perl代码是为了验证你是否需要

    use Digest::SHA qw(sha1_base64);
    my $clientKey="xyz";
    my $specifcationGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    my $fullWebSocketKey = "$clientKey$specifcationGUID";

    # dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
    #print "Fill socket key is $fullWebSocketKey\n";
    # 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 
    # 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea
    print sha1_base64($fullWebSocketKey) . "=";

【讨论】:

但是在 sha1 和 base64 之后它已经得到了最后的“=”。需要2个吗?? 尝试将代码中的最终字符串与 perl 的字符串进行比较,它们应该是相同的 另外请检查 sha1 字符串的长度应该是 20。strlen(str) 也可能是一个问题。 那么 sha_str 应该有 20 的长度?所以如果 strlen((char*)sha_str) 不返回 20 是不是错了? 所以,我得到了密钥末尾的'/n',所以我删除了它并开始工作。

以上是关于C++ WebSocket 服务器实现(接受密钥不匹配)的主要内容,如果未能解决你的问题,请参考以下文章

为啥只接受我密钥中的前 2 个字符? C++ [关闭]

Websockets - Sec-WebSocket-Accept 不匹配

为啥客户端不接受我的 WebSocket 响应握手?

C++ 中的 SIP Websocket 客户端实现

C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接

Springboot +WebSocket学习