非常好的一个ws C++ 服务器端的协议解释

websocket和TCP/IP多了一个握手协议(ws协议不用2字节长度加数据体的协议)

1、ws_protocol类

 
  1. class ws_protocol{

  2. public:

  3. static bool ws_shake_hand(session* s, char* body, int len);

  4. static bool read_ws_header(unsigned char* recv_data, int recv_len, int* pkg_size, int* out_header_size);

  5. static void parser_ws_recv_data(unsigned char* raw_data, unsigned char* mask, int raw_len);

  6. static unsigned char* package_ws_send_data(const unsigned char* raw_data, int len, int* ws_data_len);

  7. static void free_package_data(unsigned char* ws_pkg);

  8. };

2、ws_shake_hand 握手协议,客户端向服务器发送握手请求报文

 
  1. GET /chat HTTP/1.1

  2. Host: server.example.com

  3. Upgrade: websocket

  4. Connection: Upgrade

  5. Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

  6. Origin: http://example.com

  7. Sec-WebSocket-Protocol: chat, superchat

  8. Sec-WebSocket-Version: 13

3、当服务器收到报文请求时,解析报文,把Sec-WebSocket-Key加上migic(s3pPLMBiTxaQ9kYGzzhZRbK+xOo=258EAFA5-E914-47DA-95CA-C5AB0DC85B11)进行sha1加密,然后再base64编码后,发送给客户端

 
  1. HTTP/1.1 101 Switching Protocols

  2. Upgrade: websocket

  3. Connection: Upgrade

  4. Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

  5. Sec-WebSocket-Protocol: chat

s3pPLMBiTxaQ9kYGzzhZRbK+xOo=:这段报文就是Keymigic加密后编码而成的,当客户端收到上面报文websocket握手成功即可发送数据

4、read_ws_header读取头信息websocket数据收发协议

  1. Websocket协议第一个字节是0x81或0x82,第二个字节是长度head_size = 2
  2. 如果第二个字节小于125,表示后面就有多少个字节的数据 head_size = 2 + 4
  3. 如果第二个字节等于126,表示后面2字节是后面数据的长度 head_size = 2+2+4
  4. 如果第二个字节等于127,表示后面8字节是后面的长度 head_size=2+8+4
  5. 长度后面紧跟4个字节的umask,
  6. umask后紧跟真实数据

5、ws数据发送协议打包(发送给客户端的不需要umask即可)

 
  1. unsigned char* ws_protocol::package_ws_send_data(const unsigned char* raw_data, int len, int* ws_data_len){

  2. int head_size = 2;

  3. if (len > 125 && len < 65536) {

  4. head_size += 2;

  5. }

  6. else if (len >= 65536) {

  7. head_size += 8;

  8. return NULL;

  9. }

  10. unsigned char* data_buf = (unsigned char*)cache_alloc(wbuf_allocer, head_size + len);

  11. data_buf[0] = 0x81;

  12. if (len <= 125) {

  13. data_buf[1] = len;

  14. }

  15. else if (len > 125 && len < 65536) {

  16. data_buf[1] = 126;

  17. data_buf[2] = (len & 0x0000ff00) >> 8;

  18. data_buf[3] = (len & 0x000000ff);

  19. }

  20. memcpy(data_buf + head_size, raw_data, len);

  21. *ws_data_len = (head_size + len);

  22. return data_buf;

  23. }

 

 

注意这个unmask字段, 在许多文章里面都没有提到, 很棒

 

https://blog.csdn.net/qq_28710983/article/details/83151558

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值