zoukankan      html  css  js  c++  java
  • TSINGSEE青犀视频编译Winsock2 websocket服务端连接异常断开问题排查

    websocket是独立的、创建在 TCP 上的协议,用户可以扩展协议、实现部分自定义的子协议。我们在编译WebRTC时,采用websocket进行通信,在写Window c++ websocket服务端时,客户端连接出现以下连接信息,但是在客户端测试websocket消息时,控制台不打断户端发出消息。

    在网上查找了一番,原来客户端连接请求发出,websocket服务要通过固定格式再次发给客户端,这样就是代表建立连接成了。

    在服务端启动时,客户端首先发送握手消息请求(请看上图),里面有个最重要的一行信息Sec-WebSocket-Key的数值,但是这个数值是随机生成的。需要对这个信息按照固定方式进行加密然后反馈给客户端。其实就是请求把协议升级到websocket协议,需要同意并按照规矩加密数据传回去。

    服务器返回握手消息给客户端,Sec-WebSocket-Key就是加密后的数据(请看下图),最后websocket需要以 结尾,不然会导致websocket连接断开和接收不到消息。

    最后就是普通的websocket通讯了。唯一不同的是,来的数据使用的掩码处理的,去的时候别用掩码处理。不然这样违反规则websocket会立马断开并报异常,导致连接再次断开。

    我们解决问题的方式是通过字符串拼接,并发送以下信息,这样建立连接成功:

    "HTTP/1.1 101 Switching Protocols "

    "Connection: Upgrade "

    "Sec-WebSocket-Accept: " + 此处是进行websocket加密建立连接的数据(握手动作的关键所在) + " "

    "Upgrade: websocket "

    这样剩下的通信基本和websocket一样,唯一不同的是客户端和服务端都是经过加密的,所以拿到数据要进行解密才能看到具体数据。

  • 相关阅读:
    java根据汉字获取全拼和首字母
    SQL 增加或删除一列
    C#实现WinForm传值实例解析
    C# 静态类与非静态类、静态成员的区别分析
    c# 面相对象1-概括
    c# 面相对象2-之封装性
    c# 面相对象3-之继承性
    面向对象基础知识(含义、修饰符、三大特性)
    c# 面相对象4-多态性
    用集合求平均分
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/14955031.html
Copyright © 2011-2022 走看看