关于c ++:如何解释浏览器的Sec-websocket-key用于服务器握手?

How to interpret the browser's Sec-websocket-key for server handshake?

我已经在C++中编写了一个支持普通网站的基本HTTP服务器,但现在我尝试扩展它来支持WebSoCukes。所有的联网和解析都是由我自己的代码完成的,所以没有库——除了我复制和粘贴了一些用于计算sha1和转换为base64的代码。

我正在阅读一些介绍如何与传入的WebSocket连接握手的指南,例如:http://www.altdev.co/2012/01/23/writing-your-own-websocket-server/和http://enterprisewebbook.com/ch8_websockets.html

我被困在服务器需要从客户机头部获取密钥并在其上附加魔术字符串的部分,然后用sha1散列,在base64中编码,并将结果作为接受头的一部分发送回来。

给我带来麻烦的具体部分是键中的"==",以及服务器返回的结果字符串中的"="。我找不到任何说明如何处理这些内容的信息——在将魔术字符串附加到键之前,我是从键中删除==,还是保持它们的状态?另外,我也不知道最终服务器答案末尾的"="来自哪里——为什么服务器的答案只有一个"=",而客户机的密钥只有两个"="

最后,我对服务器使用的神奇字符串为什么在base16中感到困惑,但是客户机浏览器发送的密钥已经是base64了——在追加服务器字符串之前,我是否需要将其转换为base64,或者这无关紧要?

当我转换成base64时,我是将它转换成每个ASCII符号都是数字(所以字符串中的"a"应该是10),还是将整个字符串的二进制表示转换成一个表示原始二进制但带有base64数字的字符串?

对不起,如果这是一个愚蠢的问题,但我没有做太多的网络编程,所以当文章假设读者知道一些关于部分信息的内容时,我会感到困惑。


伪代码:

1
2
3
4
key_decoded = base64_decode(key64)
magic ="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
response = SHA1(append(key_decoded, magic))
response_encoded = base64_encode(response)

base64编码数据末尾的"="用于将数据填充到所需的长度。你不必为此做任何事。(请参见此处:为什么base64编码的字符串末尾有一个=符号)不同长度的输入数据可能需要不同的填充量,因此在您的示例中,两个编码的值具有不同的填充量。

当您转换为base64时,您不假设输入数据的任何内容,它只是输入字节。不要将"a"转换为10(您似乎认为ASCII字符应该表示十六进制数字,这与此无关)