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.监控作业执行.运行作业 ...
随机推荐
- js函数调用二种常用方法的例子
js中函数调用的两种常用方法. 一个js函数 function test(aa){ window.alert("你输入的是"+aa); } 方法一:直接调用 test(" ...
- iOS7相机隐私判断
转自:http://borissun.iteye.com/blog/1992303 装了iOS7的ip5的隐私设置里多了相机这一项(ip4装iOS7就没有). 如果隐私里把你的app对应的相机给关了, ...
- 互斥锁pthread_mutex_init()函数
linux下为了多线程同步,通常用到锁的概念.posix下抽象了一个锁类型的结构:ptread_mutex_t.通过对该结构的操作,来判断资源是否可以访问.顾名思义,加锁(lock)后,别人就无法打开 ...
- SSH框架整合开发具体解释(个人笔记)
一.创建数据库并设置编码. A) create database oa default character set utf8. 二.MyEclipseproject A) 在Myeclipse里创建w ...
- IIS写权限漏洞 (HTTP PUT方法利用)
该漏洞的产生原因来源于服务器配置不当造成,利用IIS PUT Scaner扫描有漏洞的iis,此漏洞主要是因为服务器开启了 webdav的组件导致的可以扫描到当前的操作,具体操作其实是通过webdav ...
- python(43):collections模块
Python作为一个“内置电池”的编程语言,标准库里面拥有非常多好用的模块.比如今天想给大家 介绍的 collections 就是一个非常好的例子. 基本介绍: 我们都知道,python拥有一些内阻的 ...
- cocoside 编译错误可能问题
版本不对..查看/usr/xxx/.profile中console等的全局变量 安装了不和谐的版本..记得删除application/cosos 重新安装. 或者干掉cocostudio
- java向mysql插入数据乱码
修改jdbc的链接,将原来的 jdbc:mysql://localhost:3306/demo改为 jdbc:mysql://localhost:3306/demo?us ...
- c语言中条件编译相关的预编译指令
一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...
- Python通过ssh连接服务器并执行命令
[本文出自天外归云的博客园] 脚本示例如下: # coding:utf-8 import time,paramiko,re,StringIO def exec_shell(command): ''' ...