Web Socket rfc6455 握手 (C++)
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++)的更多相关文章
- web socket RFC6455 frame 打包、解包
#ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" ...
- Web Socket rfc6455 握 (C++)
std::string data((const char*)buf->data(),bytes_transferred); recycle_buffer(buf); std::string ke ...
- web socket (记录下来方便观看)
Web Sockets HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力. 浏览器通过 JavaScript ...
- HTML5:web socket 和 web worker
a:hover { cursor: pointer } 做练习遇到了一个选择题,是关于web worker的,问web worker会不会影响页面性能?补习功课之后,答案是不会影响. 查阅了相关资料学 ...
- ASP.NET Web API上实现 Web Socket
1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...
- ASP.NET Web API上实现 Web Socket - 转
1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...
- 基于Spring 4.0 的 Web Socket 聊天室/游戏服务端简单架构
在现在很多业务场景(比如聊天室),又或者是手机端的一些online游戏,都需要做到实时通信,那怎么来进行双向通信呢,总不见得用曾经很破旧的ajax每隔10秒或者每隔20秒来请求吧,我的天呐(),这尼玛 ...
- Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
- 【转】轮询、长轮询、iframe长连接、web socket
引自:http://www.cnblogs.com/AloneSword/p/3517463.html http://www.cnblogs.com/wei2yi/archive/2011/03/23 ...
随机推荐
- Memcached源码分析——内存管理
注:这篇内容极其混乱 推荐学习这篇博客.博客的地址:http://kenby.iteye.com/blog/1423989 基本元素item item是Memcached中记录存储的基本单元,用户向m ...
- iOS开源项目:FlatUIKit
FlatUIKit是iOS中具有扁平化风格的UI(Flat UI)组件.FlatUIKit的设计灵感来源于Flat UI和Kyle Miller.FlatUIKit中的组件是通过扩展(category ...
- poj 3264 Balanced Lineup 题解
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Subm ...
- Android studio如何导出.so库(NDK开发入门)
转自:http://blog.csdn.net/ssy_neo/article/details/51758687 项目中用到了硬件调试,google一下拿到了硬件调试的源码,可惜握草so库根本加载不进 ...
- centos安装问题集合
1.版本选择可能直接打开www.centos.org打不开,但是可以打开http://wiki.centos.org/zh/Download,直接找到centos下载列表, (1)i386:支持32位 ...
- rtsp摘要认证协议(Response计算方法)
rtsp摘要认证协议(Response计算方法) 说明: 例如:OPTIONS rtsp://192.168.123.158:554/11RTSP/1.0 RTSP客户端应该使用username ...
- XCODE修改IOS应用的名称
原地址:http://zengwu3915.blog.163.com/blog/static/2783489720136210252843/ 首先在左侧选择你的目标组中的项目文件.在中间选择“生成”选 ...
- 算法笔记_040:二进制幂(Java)
目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂 1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...
- ant design pro(二)布局
一.概述 参看地址:https://pro.ant.design/docs/layout-cn 其实在上述地址ant-design上已经有详细介绍,本文知识简述概要. 页面整体布局是一个产品最外层的框 ...
- hadoop 异常及处理总结-02(小马哥精品)
一直以来,对hdfs的警告信息不报以理睬,今天突然关注了一下.每当我操作hdfs的时候就会出现这样一个警告: WARN util.NativeCodeLoader: Unable to load na ...