std::string data((const char*)buf->data(),bytes_transferred);
recycle_buffer(buf); std::string key="Sec-WebSocket-Key:";
auto pos = data.find(key);
auto posEnd = data.find("\r\n",pos);
auto value = data.substr(pos + key.length(),posEnd - (pos + key.length()));
std::string sha1Src = trim(value);
sha1Src += std::string("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); unsigned char sha1out[20];
sha1((const unsigned char *)sha1Src.c_str(),sha1Src.length(),sha1out);
std::vector<unsigned char> data64;
for( auto c: sha1out) data64.push_back(c); std::ostringstream os_rsp;
os_rsp<<"HTTP/1.1 101 Switching Protocols\r\n"
<<"Upgrade: websocket\r\n"
<<"Connection: Upgrade\r\n"
<<"Sec-WebSocket-Accept: "<<base64Encode(data64)<<"=\r\n"
<<"\r\n";
std::string rsp = os_rsp.str();

1) data 为连接建立以后,web socketclient发送的握手协议。

2)查询到字段 Sec-WebSocket_key的值。而且拼接上GUID字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"值。

得到 sha1Src

3)对 key拼接后的值计算 sha1值,得到 sha1Out

4)应答,最基本的就是计算 Sec-WebSocket-Accept值,通过函数 base64Encode进行计算;

using namespace std;
static const unsigned char bt[64]=
{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
};
std::string base64Encode(const std::vector<unsigned char> & data ){ std::list< std::bitset<8> > bits;
for( auto c : data ){
std::bitset<8> bit(c);
bits.push_back(bit);
}
while( bits.size() % 3 != 0 ) bits.push_back( bitset<8>() ); std::vector<unsigned char> base64;
while( !bits.empty() ){
std::bitset<6> bit6_1,bit6_2,bit6_3,bit6_4;
std::bitset<8> bit8_1 = *bits.begin(); bits.pop_front();
std::bitset<8> bit8_2 = *bits.begin(); bits.pop_front();
std::bitset<8> bit8_3 = *bits.begin(); bits.pop_front(); bit6_1.set(0, bit8_1[2]);
bit6_1.set(1, bit8_1[3]);
bit6_1.set(2, bit8_1[4]);
bit6_1.set(3, bit8_1[5]);
bit6_1.set(4, bit8_1[6]);
bit6_1.set(5, bit8_1[7]); bit6_2.set(0, bit8_2[4]);
bit6_2.set(1, bit8_2[5]);
bit6_2.set(2, bit8_2[6]);
bit6_2.set(3, bit8_2[7]);
bit6_2.set(4, bit8_1[0]);
bit6_2.set(5, bit8_1[1]); bit6_3.set(0, bit8_3[6]);
bit6_3.set(1, bit8_3[7]);
bit6_3.set(2, bit8_2[0]);
bit6_3.set(3, bit8_2[1]);
bit6_3.set(4, bit8_2[2]);
bit6_3.set(5, bit8_2[3]); bit6_4.set(0, bit8_3[0]);
bit6_4.set(1, bit8_3[1]);
bit6_4.set(2, bit8_3[2]);
bit6_4.set(3, bit8_3[3]);
bit6_4.set(4, bit8_3[4]);
bit6_4.set(5, bit8_3[5]); base64.push_back( bt[bit6_1.to_ulong() ]);
base64.push_back( bt[bit6_2.to_ulong() ]);
base64.push_back( bt[bit6_3.to_ulong() ]);
base64.push_back( bt[bit6_4.to_ulong() ]);
}
base64.pop_back();
string strdata(base64.begin(),base64.end()); return strdata;
}

5) 计算后把RSP发生出去就可以。

Web Socket rfc6455 握手 (C++)的更多相关文章

  1. web socket RFC6455 frame 打包、解包

    #ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" ...

  2. Web Socket rfc6455 握 (C++)

    std::string data((const char*)buf->data(),bytes_transferred); recycle_buffer(buf); std::string ke ...

  3. web socket (记录下来方便观看)

    Web Sockets HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力. 浏览器通过 JavaScript ...

  4. HTML5:web socket 和 web worker

    a:hover { cursor: pointer } 做练习遇到了一个选择题,是关于web worker的,问web worker会不会影响页面性能?补习功课之后,答案是不会影响. 查阅了相关资料学 ...

  5. ASP.NET Web API上实现 Web Socket

    1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...

  6. ASP.NET Web API上实现 Web Socket - 转

    1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...

  7. 基于Spring 4.0 的 Web Socket 聊天室/游戏服务端简单架构

    在现在很多业务场景(比如聊天室),又或者是手机端的一些online游戏,都需要做到实时通信,那怎么来进行双向通信呢,总不见得用曾经很破旧的ajax每隔10秒或者每隔20秒来请求吧,我的天呐(),这尼玛 ...

  8. Node.js + Web Socket 打造即时聊天程序嗨聊

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...

  9. 【转】轮询、长轮询、iframe长连接、web socket

    引自:http://www.cnblogs.com/AloneSword/p/3517463.html http://www.cnblogs.com/wei2yi/archive/2011/03/23 ...

随机推荐

  1. PHP:同一件事,有太多的方式

    背景 刚接触PHP,发现PHP做一件事有太多的方式,挺灵活的,这或许是PHP的一种设计哲学,也有可能是语言演化的结果,下面举几个例子. 几个例子 在web中嵌入PHP代码. <?php  ?&g ...

  2. C++中经常使用到宏

    _DOS_       表示MS-DOS 16位系统平台 WIN32       表示Windows32位系统平台 WIN64       表示Windows64位系统平台 _WIN32_WCE  表 ...

  3. 更改Thunderbird的默认语言

    使用的Thunderbird Poratable版本是英文的,可以用以下方式修改为中文界面: 1.下载中文语言包 在官方网站的https://addons.mozilla.org/en-US/thun ...

  4. Linux进程间通信—共享内存

    五.共享内存(shared memory) 共享内存映射为一段可以被其他进程访问的内存.该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中.共享内存是最快的IPC机制,但由于linux本身 ...

  5. 2016 Top 10 Android Library

    过去的 2016 年,开源社区异常活跃,很多个人与公司争相开源自己的项目,让人眼花缭乱,然而有些项目只是昙花一现,有些项目却持久创造价值,为开发者提供了极大的便利,这些终究由时间来判断.今天,我就来整 ...

  6. Tomcat与Servlet工作流程

    什么是Tomcat? Tomcatserver是一个免费的开放源码的Web 应用server,属于轻量级应用server. 什么是Servlet? Servlet是在server上执行的小程序.,说白 ...

  7. Shell编程(脚本)的经常使用命令和语句

    一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...

  8. 【转】js-ES6学习笔记-Symbol

    原文:https://www.cnblogs.com/zczhangcui/p/6435652.html https://blog.mgechev.com/2017/09/16/developing- ...

  9. scala lambda 小括号与大括号

    看akka源码的时候看到这样的一个用法: 作为接触scala两天半的我有些看不明白了.好一番搜索看到这样的答案: <scala雾中风景(2): 小括号与花括号> 下面的问题,表面上看是小括 ...

  10. TortoiseSVN 源代码下载

    SVN的客户端软件TortoiseSVN http://tortoisesvn.tigris.org/ 这是我采用的 TortoiseSVN 的官方网站,页面上的两只小乌龟真的很好看. 目前最新的版本 ...