C++编程中Websocket服务器错误

4

我正在尝试创建一个WebSocket服务器程序。这是握手代码。然而,当我使用Chrome进行连接时,连接会断开。请查看并检查是否有任何错误。

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) 
    {

        char *s = strstr(recvbuf,"Sec-WebSocket-Key:");
        s = s + strlen("Sec-WebSocket-Key:");

        char  buff[200] = {};
        int i = 0;
        while((int)*s != 13)
        {
            if((int)*s != 32)
            {
                buff[i] = *s;
                i++;
            }
            s++;
        }
        buff[i] = '\0';
        strcat(buff,"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
        hashwrapper *myWrapper = new sha1wrapper();
        std::string hash(myWrapper->getHashFromString(buff));

        std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hash.c_str()), hash.length());

        char * handshakeFormat = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
    "Upgrade: WebSocket\r\n"
    "Connection: Upgrade\r\n"
    "Sec-WebSocket-Accept: %s\r\n\r\n";

        memset(recvbuf,0,sizeof(recvbuf));
        sprintf(recvbuf,handshakeFormat,encoded.c_str());
                iSendResult = send( ClientSocket, recvbuf, iResult, 0 );


        delete myWrapper;
        myWrapper = NULL;
    }
    

为了测试目的:

密钥 = "dGhlIHNhbXBsZSBub25jZQ=="

唯一密钥 = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

sha1 哈希值 : "b37a4f2cc0624f1690f64606cf385945b2bec4ea"

这是由我的 sha1 哈希函数生成的。

RFC6455 规范下的实际 sha1 哈希值: "0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea"

base64 编码后 = "YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ=="

这是由我的 base64 编码器生成的。

RFC6455 规范下的实际 base64 编码值: "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="

Google Chrome 以以下格式发送握手数据:

GET /?encoding=text HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:2000
Origin: http://www.websocket.org
Sec-WebSocket-Key: SEvjVT+KuQHF0TRSdop3GA==
Sec-WebSocket-Version: 13

这可能有点令人困惑。我的尝试是实现那段代码,但它没有起作用。每次连接都会断开。为了找到错误,我使用RFC中的示例数据,尝试查看我的编码值是否正确。然而,它并不正确。但是,我的程序创建的base64编码值与在线base64编码器找到的编码完全相似。所以我确定我的是正确的,RFC是错误的。但如果我的是正确的,为什么它不起作用? - S. Swaroop
嗯,其实我所有的代码都是用C写的,但哈希和编码部分是用C++编写的。而且这部分代码不是我写的。 - S. Swaroop
问题是我得到了一个非常长的(56个字符)base64编码字符串。但实际字符串应该只有28个字符长。那么错误在哪里? - S. Swaroop
1个回答

2
你需要对哈希的字节值进行编码。目前你是在将哈希转换为十六进制字符串后再进行编码。
解码“s3pPLMBiTxaQ9kYGzzhZRbK+xOo=”并将输出转换为十六进制字符串,你会发现它是B3 7A 4F 2C C0 62 4F 16 90 F6 46 06 CF 38 59 45 B2 BE C4 EA
而另一方面,解码“YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==”得到的结果是(字符串)“b37a4f2cc0624f1690f64606cf385945b2bec4ea”

我预料到会有这种错误。我正在使用 hashlib 库来计算 sha1 哈希值。在上面的代码中,hash.c_str() 返回的哈希值是 "b37a4f2cc0624f1690f64606cf385945b2bec4ea"。我该如何获取正确的哈希值,以便传递给 base64_encode 函数呢? - S. Swaroop
我不知道 hashlib。看一下是否有提供原始哈希字节的函数。如果没有,请选择另一个库,实际上有数百个库实现了 SHA - pezcode
嘿,由于有人对上面的问题进行了投票,我已被禁止在此处提问。请有人点赞,这样我就可以提出其他问题了。我尝试使用crypto++,但是它给我带来了很多错误,比如“未解析的外部符号“public: virtual bool ...””。这里是代码片段存在的链接[link]https://dev59.com/t1rUa4cB1Zd3GeqPgAlj - S. Swaroop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接