//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分析二的更多相关文章

  1. Sword websocket分析一

    什么是WebSocket WebSocket是一个允许Web应用程序(通常指浏览器)与服务器进行双向通信的协议. HTML5的WebSocket API主要是为浏览器端提供了一个基于TCP协议实现全双 ...

  2. SNMP报文抓取与分析(二)

    SNMP报文抓取与分析(二) SNMP报文抓取与分析(二) 1.SNMP报文表示简介 基本编码规则BER 标识域Tag表示 长度域length表示 2.SNMP报文详细分析(以一个get-respon ...

  3. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  4. yhd日志分析(二)

    yhd日志分析(二) 继续yhd日志分析,统计数据 日期 uv pv 登录人数 游客人数 平均访问时长 二跳率 独立ip数 1 分析 登录人数 count(distinct endUserId) 游客 ...

  5. SQLite入门与分析(二)---设计与概念(续)

    SQLite入门与分析(二)---设计与概念(续)   写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...

  6. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  7. 一些有用的javascript实例分析(二)

    原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...

  8. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  9. MapReduce深度分析(二)

    MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...

随机推荐

  1. JDK1.5新特性,基础类库篇,System类

    一. 背景 System.getenv(String)方法继续有效:增加了新的System.getenv()方法,返回保存环境变量的Map<String,String>. 同时增加了以纳秒 ...

  2. Android 调试利器:Stetho + Chrome

    简介 Stetho 由 Facebook 开发的一款查看 Android 数据库.SharePreference.网络拦截器的利器,通过与 Chrome 的配合使用,使 Android App 开发过 ...

  3. Android调用Webservice发送文件

    一服务器端C#这里有三个上传方法1.uploadFile( byte []bs, String fileName); PC机操作是没有问题2. uploadImage(String filename, ...

  4. 如何优雅的退出/关闭/重启gunicorn进程

    在工作中,会发现gunicorn启动的web服务,无论怎么使用kill -9 进程号都是无法杀死gunicorn,经过我一番百度和谷歌,发现想要删除gunicorn进程其实很简单. 1. 寻找mast ...

  5. 【Java】Java复习笔记-第一部分

    配置java环境变量 JAVA_HOME:配置JDK的目录 CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码) PATH:指定可执行程序的位置 LINUX系统 (在" .ba ...

  6. golang标准库分析之net/rpc

    net/rpc是golang提供的一个实现rpc的标准库.

  7. Python爬取新浪微博评论数据,写入csv文件中

    因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...

  8. 一句命令激活windows/office

    激活windows 服务器地址:kms.03k.org (点击检测KMS服务器是否正常) 更新: 脚本维护更新:2016-11-02 服务端版本:2017-06-17 (1111) 有疑问可以戳QQ群 ...

  9. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  10. Leetcode:Flatten Binary Tree to Linked List 解题报告

    Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ...