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.监控作业执行.运行作业 ...
随机推荐
- 【android开发】如何在Linux平台下安装JDK环境
原文:http://android.eoe.cn/topic/android_sdk Linux平台JDK安装 本文主要描述如何在Linux平台下安装JDK环境.进入网页:http://www.ora ...
- 关于的 recorder robotium 的Eclipse插件(URL:http://recorder.robotium.com/updates/或者说不可用)
最近在学robotium.看到别人说robotium的Eclipse的插件非常好用. 打算安装时.发现死活都无法连接http://recorder.robotium.com/updates/ 过程是 ...
- 临摹一个像素风格高楼shader
原始效果地址:http://glslsandbox.com/e#40050.0 是一个的城市高楼感的shader,比较像素风 可以拿来做游戏背景,或者基于这个思路做一些别的效果 这个是我后来找的版本, ...
- nodepad++ 正则 替换
(?<k1>.*?)\=(?<k2>.*?); cookie.Add(new CookieList() { Key = "\1", Value = &quo ...
- zabbix 对/etc/ssh/sshd_config文件的监控 但status为unknowen
原因为该文件没有被访问的权限: # ll /etc/ssh/sshd_config -rw------- root root Apr : /etc/ssh/sshd_config 授权后再看: [ro ...
- 技术范儿的 Keep 发力AI赛道,为什么“虚拟教练”会更懂你?
http://www.tmtpost.com/3363367.html 摘要: 虚拟教练技术会整合到一些业务场景和硬件产品中收费,但是收费的具体情况彭跃辉还暂未透露. 图片来源于Unsplash 自去 ...
- Hash(MD5校验工具)
本站提供md5校验工具下载.Hash(md5校验工具)是一款小巧好用的哈希计算器,Hash支持文件拖放,速度很快,可以计算文件的MD5.SHA1.CRC32 的值.在论坛上.软件发布时经常用Hash ...
- [Windows Azure] Windows Azure Execution Models
Windows Azure Execution Models Windows Azure provides different execution models for running applica ...
- mysql 通过echo的方式写入数据库 中文乱码解决方案
echo "set names utf8;insert into xxx (path, sn, time, flag) values ('$wav', '$sn', '$secs', 'op ...
- 【神经网络】LSTM 网络
Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息.LSTM 由Hochreiter & Schmidhuber (199 ...