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. Node.js + Web Socket 打造即时聊天程序嗨聊

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

  5. HTML5:web socket 和 web worker

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

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

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

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

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

  8. Comet、SSE、Web Socket

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(十一) Comet Comet是一种更加高级的Ajax技术("服务器推送&qu ...

  9. web socket 心跳包的实现方案

    web socket 心跳包的实现方案05/30/2010 现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我 ...

随机推荐

  1. hdu2066一个人的旅行

    枚举全部相邻城市,作为起点,多次spfa,然后每次在想去的城市中找出spfa后的距离起点最短的花费时间 #include <iostream> #include <cstring&g ...

  2. javascript 下拉列表 自己主动取值 无需value

    <select id="applyType" name="$!{status.expression}" class="inp" onc ...

  3. 如何制作python安装模块(setup.py)

    Python模块的安装方法: 1. 单文件模块:直接把文件拷贝到$python_dir/lib 2. 多文件模块,带setup.py:python setup.py install 3. egg文件, ...

  4. 计算机视觉与模式识别代码合集第二版two

    Topic Name Reference code Image Segmentation Segmentation by Minimum Code Length AY Yang, J. Wright, ...

  5. CString的部分实现剖析

    一.CString初探: 在CString的实现中,其最基础的类结构如下: CString其实只有一个数据成员m_pszData,这个成员指向了字符串的首地址.但在MFC的具体实现中, m_pszDa ...

  6. poj1243(经典dp)

    题目链接:http://poj.org/problem?id=1243 题意:让你猜一个物品的价格,猜低了或者猜高了都会提示你.G,L,表示你有G次机会猜一个数,如果猜错了,G会减少1次,如果你的错误 ...

  7. BytesWritable 存储问题

    public static void main(String args[]){ BytesWritable cv = new BytesWritable(); String str1 = " ...

  8. 聊聊高并发(三十八)解析java.util.concurrent各个组件(十四) 理解Executor接口的设计

    JUC包中除了一系列的同步类之外,就是Executor运行框架相关的类.对于一个运行框架来说,能够分为两部分 1. 任务的提交 2. 任务的运行. 这是一个生产者消费者模式,提交任务的操作是生产者,运 ...

  9. Java自学资料——线程

    [转]传智播客成都java培训中心学员笔记. 线程: static int MAX_PRIORITY 线程能够具有的最高优先级. static int MIN_PRIORITY 线程能够具有的最低优先 ...

  10. Learning Cocos2d-x for WP8(4)——中文显示

    原文:Learning Cocos2d-x for WP8(4)--中文显示 C#(wp7)兄弟篇Learning Cocos2d-x for XNA(4)——中文显示 Cocos2d-x中文显示,似 ...