Sword websocket分析二
//websocket发送数据
int send(uint8_t* message, uint64_t message_size)
{
//掩码
const uint8_t masking_key[] = { 0x12, 0x34, 0x56, 0x78 };
//协议最基本的两个字节标志
//如果data长度在126~65535之间,则此处playload的值为126
//(message_size >= 126 ? 2 : 0) --如果playload == 126,增加额外两个字节表示data的长度
//如果数据的长度大于65535,则此处playload的值为127
//需要增加8个字节来表示数据的长度
//MASK 掩码标识位,用来表明负载是否经过掩码处理,浏览器发送的数据都是经过掩码处理(浏览器自动处理,
//无需开发者编码),服务器发送的帧必须不经过掩码处理。所以此处浏览器发送的帧必为1,服务器发送的帧必为0,否则应断开WebSocket连接
//payload length 后面4个字节可能是掩码的key(如果掩码位是1则有这4个字节的key,否则没有)
const int headlen = + (message_size >= ? : ) + (message_size >= ? : ) + (_useMask ? : ); uint8_t* header = new uint8_t[headlen];
uint8_t* txbuf = NULL;
uint64_t i = ; memset(header, , sizeof(uint8_t)*headlen);
//0x80(1000 0000) 表示一帧之内将所有的数据全部发过去
header[] = 0x80 | type; if (message_size < ) {
header[] = (message_size & 0xff) | (_useMask ? 0x80 : );
if (_useMask) {
//payload length 后面4个字节是掩码的key
header[] = masking_key[];
header[] = masking_key[];
header[] = masking_key[];
header[] = masking_key[];
}
}
else if (message_size < ) {
header[] = | (_useMask ? 0x80 : );
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
if (_useMask) {
header[] = masking_key[];
header[] = masking_key[];
header[] = masking_key[];
header[] = masking_key[];
}
}
else { // TODO: run coverage testing here
header[] = | (_useMask ? 0x80 : );
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
header[] = (message_size >> ) & 0xff;
if (_useMask) {
header[] = masking_key[];
header[] = masking_key[];
header[] = masking_key[];
header[] = masking_key[];
}
} }
//服务器响应客户端websocket升级请求
int response()
{
strcat(resData, "HTTP/1.1 101 Switching Protocols\r\n");
strcat(resData, "Upgrade:websocket\r\n");
strcat(resData, "Connection: upgrade\r\n");
strcat(resData, "Sec-WebSocket-Version:13\r\n"); snprintf(serverkey, , "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", stHeader.websocketKey); /*
把Sec-WebSocket-Key加上一个魔幻字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11。
使用 SHA-1 加密,之后进行 BASE-64编码,将结果作为 Sec-WebSocket-Accept 头的值
此处注意,网上的sha1加密都已经字符串化了,并非实际得到的sha1密文,sha1的密文不完全是由[0-9a-z]组成的
*/
result = sha_encode(SHA_1, (unsigned char *)serverkey, strlen(serverkey), (unsigned char **)&shaTmp, &shalen);
if (result)
{
return -;
}
result = base64_encode(shaTmp, shalen, &pcOut, &outlen);
if (result)
{
return -;
}
strcat(resData, "Sec-WebSocket-Accept:");
strcat(resData, pcOut);
strcat(resData, "\r\n");
}
Sword websocket分析二的更多相关文章
- Sword websocket分析一
什么是WebSocket WebSocket是一个允许Web应用程序(通常指浏览器)与服务器进行双向通信的协议. HTML5的WebSocket API主要是为浏览器端提供了一个基于TCP协议实现全双 ...
- SNMP报文抓取与分析(二)
SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- yhd日志分析(二)
yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- Android4.0图库Gallery2代码分析(二) 数据管理和数据加载
Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...
- MapReduce深度分析(二)
MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...
随机推荐
- C++的iterator与const_iterator
所有的标准库容器都定义了相应的迭代器类型.迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素. 1.iterator,const_iterator作用:遍历容器内 ...
- 译: 2. Apache Axis2安装指南
Apache Axis2安装指南 本文档提供有关Axis2分发包,系统先决条件以及设置环境变量和工具的信息,然后提供有关安装方法的详细说明. 请将您的反馈发送至:java-dev@axis.apach ...
- Vuex 实践讲解
state 用来数据共享数据存储 mutation 用来注册改变数据状态 getters 用来对共享数据进行过滤操作 action 解决异步改变共享数据 这个四大特征就是核心,如何用怎么用 接下来还是 ...
- G1 Garbage Collector and Shenandoah
http://www.diva-portal.se/smash/get/diva2:754515/FULLTEXT01.pdf https://is.muni.cz/th/ifz8g/GarbageC ...
- 实战mysql分区
前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...
- [Windows Azure] Getting Started with Windows Azure SQL Data Sync
Getting Started with Windows Azure SQL Data Sync In this tutorial, you learn the fundamentals of Win ...
- Linux服务开机自启动使用示例
本文以redis服务为例,介绍了两种服务自启动的方法service,systemctl使用示例 1.修改redis.conf,允许后台运行 daemonize no 改为 daemonize yes ...
- 【转】cocos2d-x动画加速与减速
移步原帖传送门:cocos2d-x动画加速与减速 动画是游戏的必然要素之一,在整个游戏过程中,又有着加速.减速动画的需求.以塔防为例子,布塔的时候希望能够将游戏减速,布好塔后,则希望能将游戏加速:当某 ...
- rem布局计算(移动端,pc端有兼容性)
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <script> 5 functio ...
- GitHub支持的Markdown语法 GitHub Flavored Markdown
GitHub支持的Markdown语法,简称GFM.相比标准的Markdown(SM)语法,有少数几个区别,并添加了新的功能. 本位参考 GitHub Flavored Markdown 撰写.有兴趣 ...