前提:笔者在开发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. 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案 1
  2. 精通Zookeeper系列开篇:进大厂不得不学的分布式协同利器!
  3. numpy中的cov(方差计算)简单介绍
  4. Web Application Stress Tool(WAS)性能测试
  5. 无废话-SQL Server 2005新功能(1) - TSQL
  6. SQL基础---SQL ORDER BY 子句
  7. 算法练习day18——190409(Manacher)
  8. oracleasm 建立时出错
  9. mysql中给用户添加密码_MySql中添加用户,新建数据库,用户授权,删除用户,修改密码...
  10. 谈谈IT行业的一些生存之道!
  11. kali里PHP文件502错误,解决Linux Kali iptables开放22端口失败等一系列问题
  12. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)
  13. 给超链接A添加按钮样式
  14. 05-UIDynamic
  15. 【RPC】远程过程调用
  16. Smart Panels精彩系列面板_备份和恢复的具体步骤(2种方法)
  17. 【无标题】C# 修改操作时禁用过滤器
  18. Ubuntu18.04下OpenCV调用笔记本摄像头
  19. 破解电视盒 运营商送的,各种型号。通用 TTL 破解电视盒,更新华为悦盒
  20. java编写打砖块小游戏

热门文章

  1. 软件测试 Top 120 Blog (博客)
  2. 38. DDR2内存初始化代码分析-1
  3. 5G学习:协议规范与命名规则
  4. 攻防世界 Pwn greeting-150
  5. Win系统 - 内存稳定性测试软件(MemTest)
  6. 西门子 PLC TCP 通信协议
  7. ESP8266 网页调控RGB灯
  8. c语言调用同一目录下的函数,从C中同一目录中的另一个文件调用函数
  9. Linux命令之more(11)
  10. python3.7 匹配淘口令