【发布时间】:2014-06-27 20:36:04
【问题描述】:
我已经用 C++ 编写了一个支持常规网站的基本 HTTP 服务器,但现在我正在尝试扩展它以支持 websockets。所有的网络和解析都是由我自己的代码完成的,所以没有库——除了我复制并粘贴了一些用于计算 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——我需要在附加之前将服务器字符串转换为base 64,还是需要没关系?
当我转换为 base 64 时,我是将其转换为好像每个 ascii 符号都是数字(因此字符串中的“A”将是 10),还是将整个字符串的二进制表示转换为字符串代表原始二进制但带有base64的数字?
对不起,如果这是一个愚蠢的问题,但我没有做太多的网络编程,所以当文章假设读者对部分信息有所了解时,我会感到困惑。
【问题讨论】: