TSINGSEE青犀视频编译Winsock2 websocket服务端连接异常断开问题排查
Posted TSINGSEE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TSINGSEE青犀视频编译Winsock2 websocket服务端连接异常断开问题排查相关的知识,希望对你有一定的参考价值。
websocket是独立的、创建在 TCP 上的协议,用户可以扩展协议、实现部分自定义的子协议。我们在编译WebRTC时,采用websocket进行通信,在写Window c++ websocket服务端时,客户端连接出现以下连接信息,但是在客户端测试websocket消息时,控制台不打断户端发出消息。
在网上查找了一番,原来客户端连接请求发出,websocket服务要通过固定格式再次发给客户端,这样就是代表建立连接成了。
在服务端启动时,客户端首先发送握手消息请求(请看上图),里面有个最重要的一行信息Sec-WebSocket-Key的数值,但是这个数值是随机生成的。需要对这个信息按照固定方式进行加密然后反馈给客户端。其实就是请求把协议升级到websocket协议,需要同意并按照规矩加密数据传回去。
服务器返回握手消息给客户端,Sec-WebSocket-Key就是加密后的数据(请看下图),最后websocket需要以\\r\\n\\r\\n结尾,不然会导致websocket连接断开和接收不到消息。
最后就是普通的websocket通讯了。唯一不同的是,来的数据使用的掩码处理的,去的时候别用掩码处理。不然这样违反规则websocket会立马断开并报异常,导致连接再次断开。
我们解决问题的方式是通过字符串拼接,并发送以下信息,这样建立连接成功:
"HTTP/1.1 101 Switching Protocols\\r\\n"
"Connection: Upgrade\\r\\n"
"Sec-WebSocket-Accept: " + 此处是进行websocket加密建立连接的数据(握手动作的关键所在) + "\\r\\n"
"Upgrade: websocket\\r\\n\\r\\n"
这样剩下的通信基本和websocket一样,唯一不同的是客户端和服务端都是经过加密的,所以拿到数据要进行解密才能看到具体数据。
以上是关于TSINGSEE青犀视频编译Winsock2 websocket服务端连接异常断开问题排查的主要内容,如果未能解决你的问题,请参考以下文章
TSINGSEE青犀视频编译webrtc协议为什么需要turn服务器?
TSINGSEE青犀视频编译行人识别系统写入sql(python)语句实现流程
TSINGSEE青犀视频编译中通过GoLang代码修改Linux服务的ulimit的实现
TSINGSEE青犀视频webrtc相关内容编译如何在c++端编码出H264?