【问题标题】:Websocket server in C++ programming errorC++编程错误中的Websocket服务器
【发布时间】:2012-03-26 07:48:13
【问题描述】:

我正在尝试创建一个 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;
    }
    

用于测试目的:

key = "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 是错误的。但如果我的是正确的,那为什么它不工作
  • 嗯。实际上我所有的代码都在 C 中,但只有散列和编码部分是 C++。而且我还没有写过代码。
  • 问题是我得到了一个很长(56 个字符)的 base64 编码字符串。但实际的字符串应该是 28 个字符长。那么错误在哪里?

标签: c++ windows google-chrome websocket


【解决方案1】:

您必须对哈希的字节值进行编码。现在,您正在将哈希转换为十六进制字符串,然后再对其进行编码。

解码 "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 的正确哈希值?
  • 我不知道 hashlib。看看是否有一个函数可以为您提供原始哈希字节。如果没有选择另一个库,那么实际上有数百个实现 SHA
  • 嘿,我被禁止在这里提问,因为有人对上述问题投了反对票。有人请把它放上来,这样我就可以问其他问题了。我尝试使用crypto++。但这给了我很多错误,例如 unresolved external symbol "public: virtual bool ..." 这是代码 sn-p 存在的链接 [link]stackoverflow.com/questions/6981616/…
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 2018-08-23
  • 2018-09-19
  • 2014-11-05
  • 2019-08-07
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多