前提:笔者在开发server程序时,要求websocket与server连接

websocket的机制是在第一次连接时进行握手协议,协议通过,才可以进行正常的通信,否则websocket就会断开连接;

下面就是websocket第一次发送的握手包:

GET / HTTP/1.1\r\n
Host: 192.168.5.24:17913\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0\r\n
Accept: */*\r\n
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\n
Accept-Encoding: gzip, deflate\r\n
Sec-WebSocket-Version: 13\r\n
Origin: http://127.0.0.1:8848\r\n
Sec-WebSocket-Extensions: permessage-deflate\r\n
Sec-WebSocket-Key: tepG0DQZtEJ7MLbw7kbewA==\r\n
Connection: keep-alive, Upgrade\r\n
Pragma: no-cache\r\nCache-Control: no-cache\r\n
Upgrade: websocket\r\n\r\n

那需要对websocket发送来的第一个数据进行处理(判断是否是第一个包,可以通过开头GET来进行判断,可能不是非常严谨),获取Sec-WebSocket-Key的值(也就是上面的ikLk+bBgZDQRPTOBAzGsBg==),然后对此进行解析。

解析的方法是在key上加上固定字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,再进行sha1解码及base64编码,然后打包发送给websocket客户端。

返回的握手包如下:

HTTP/1.1 101 Switching Protocols\r\n
Connection: upgrade\r\n
Sec-WebSocket-Accept: mhW8gChbFWgUKJxpzcbPlcwJxcw=\r\n
Upgrade: websocket\r\n\r\n

代码如下:

void rcvReadData()
{QByteArray data_ = this->readAll();//socket接收数据if(!_firstConnect)//第一个包{_firstConnect = true;QString qstr_ = data_;//包数据转化成QStringQString key_ = "";key_ = getKey(qstr_);if(key_ == "-1"){//自定义处理}else if(key_ == "-2"){//自定义处理}else{//处理keychar request[1024] = "";  //请求信息respondHandshake(request,key_.toStdString());QByteArray array_(request);write(array_);//发送数据给websocket客户端}}else{//接下来包在此不做处理,需要涉及到websocket协议的解包}
}/**
*获取Sec-WebSocket-Key的值,QT实现
*/
QString getKey(QString qstr)
{int i = qstr.indexOf("GET");if(i < 0){return "-1";}int j = qstr.indexOf("Sec-WebSocket-Key");if(j < 0){return "-2";}QString key = qstr.mid(j + 19, 24);return key;
}/**
*获取Sec-WebSocket-Key的值,C++实现
*/
string getKey(string str)
{int i = str.find("GET");if(i < 0){return "-1";}int j = str.find("Sec-WebSocket-Key");if(j < 0){return "-2";}string key = str.substr(j + 19, 24);return key;
}void respondHandshake(char *request, string clientkey)
{strcat(request, "HTTP/1.1 101 Switching Protocols\r\n");strcat(request, "Connection: upgrade\r\n");strcat(request, "Sec-WebSocket-Accept: ");string server_key = clientkey;server_key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";SHA1  sha;unsigned int message_digest[5];cout <<"server_key:"<< server_key << endl;sha.Reset();sha << server_key.c_str();sha.Result(message_digest);for (int i = 0; i < 5; i++) {message_digest[i] = htonl(message_digest[i]);}base64 base64_;server_key = base64_.base64_encode(reinterpret_cast<const unsigned char*>(message_digest), 20);server_key += "\r\n";strcat(request, server_key.c_str());strcat(request, "Upgrade: websocket\r\n\r\n");
}

至于代码中出现的sha1以及base64,,可以在以下链接中找到,本文就不再复制粘贴了:

https://blog.csdn.net/weixin_34196559/article/details/83479894

以上只是对握手协议进行了实现,但是实际使用中,在握手完成后,对于websocket发送来的数据,还需要进行解析,才可以获取数据,而且在解析时,还需要处理粘包半包等问题,留待下一篇文章进行阐述。

解析发送的数据,见我下一章:C++实现WebSocket解析协议

结尾:

只为记录,只为分享! 愿所写能对你有所帮助。不忘记点个赞,谢谢~

C++实现websocket服务器握手协议(使用Qt)相关推荐

  1. 基于Websocket草案10协议的升级及基于Netty的握手实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 最近发现 ...

  2. pythonsocket自定义协议_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器...

    最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻烦的地方,虽然我们是一个以前端开发和设计见长的团队,而且作为 ...

  3. WebSocket握手协议

    尊重原创,原文链接 一.阅前热身 什么是keep-alive 1.keep-alive只是客户端的一种建议 我们打开百度首页,进一步查看header. 如图,我们看到请求header中有一行: Con ...

  4. 最低服务器协议,的WebSocket服务器最低要求

    我知道的WebSocket是一个协议,所以正好通过FTP或HTTP进行通信,应该不依赖于任何操作系统的要求.我发现不同的库使用这个协议,但他们似乎对.Net 4+(没有Windows XP),至少Vi ...

  5. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  6. websocket 更新点位 浏览器卡顿_我们来看看Swoole是如何实现WebSocket服务器及客户端的...

    php自学中心 2019-11-08 10:25:30 文章来自:laravel学院WebSocket 概述 在此之前,有必要对 WebSocket 的原理做简单的说明,WebSocket 复用了 H ...

  7. 创建WebSocket服务器

    程序代码 ws_server.php //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0 ...

  8. netty系列之:使用netty搭建websocket服务器

    文章目录 简介 netty中的websocket websocket的版本 FrameDecoder和FrameEncoder WebSocketServerHandshaker WebSocketF ...

  9. python websocket服务器https_Socket与WebSocket以及http与https重新总结

    Socket与WebSocket以及http与https重新总结 一.Socket 网络中的Socket是一个抽象的接口 ,而是为了方便使用TCP或UDP而抽象出来的一层 ,可以理解为网络中连接的两端 ...

最新文章

  1. Self-Attention 加速方法一览:ISSA、CCNet、CGNL、Linformer
  2. 【 C 】高级字符串查找之 strspn 和 strcspn 的思考
  3. javascript搜索框联想搜索_js实现类似于联想关键词的搜索功能(附代码)
  4. 47.nginx+tomcat群集
  5. poj 1006(中国剩余定理)
  6. C# 数据库dataGridView刷新数据和主外键判断
  7. codeforces 282A-C语言解题报告
  8. 高校老师因发消息爱打“???”被学生投诉,被学校撤职后反手上述获赔13万...
  9. beautifulsoup_BeautifulSoup爬虫了解一下
  10. canvas笔记-文字渲染
  11. 资源分享 | 知识蒸馏总结、应用与扩展(2015-2019)
  12. loadrunner mysql脚本_LoadRunner11_MySQL数据库脚本
  13. javascript中的小括号
  14. 快速轻巧的CQRS和事件源解决方案
  15. 「BZOJ2190」[SDOI2008] 仪仗队 - 欧拉函数
  16. 蓝桥杯“基础练习:查找整数
  17. php读写明华读卡器,rwCard 明华USBIC卡读卡器IC卡读写程序 - 下载 - 搜珍网
  18. 漫谈TCP-AIMD/BBR的公平性以及buffer bloat
  19. 计算机辅助教学属于多媒体技术应用吗,多媒体技术在计算机辅助教学中的应用...
  20. 麦克风MIC 工作原理以及灵敏度调整

热门文章

  1. centos7 hadoop+hive 安装
  2. python语音朗读
  3. 16进制转带符号的10进制,16进制转负数10进制
  4. 击败一半参赛程序员,DeepMind 重磅推出 AlphaCode
  5. 为什么需要对数据“加盐”处理
  6. 干货|小红书kol投放营销方法论-KOL如何筛选、投放、复盘
  7. 政务部门数据交换共享方式对比
  8. 基于c++下的简易书籍查询系统(C++实验常用)
  9. 【NPDP】大师级管理人物盘点:竞争战略之父-迈克尔·波特
  10. qcom sdm660 led 分析