如何在c++中作为websocket客户端发送消息到服务器

How to send messages as websocket client in c++ to a server?

本文关键字:客户端 消息 服务器 websocket c++      更新时间:2023-10-16

我在向服务器发送消息时遇到了一点问题。它可能发送它们和服务器接收它们,但我不知道如何正确地屏蔽它们。我知道这实际上是:https://www.rfc-editor.org/rfc/rfc6455#section-5.2但我不太明白。如果有人能分享从普通消息到写入缓冲区实际需要完成的整个伪代码,那就太好了。我也在这里搜索了很多信息,但他们大多是建议库或直接链接。问题是lib很好,但实际上我已经做了所有我需要的。只有发送掩码丢失。

可以发送掩码位被去掉的消息吗?

当设置掩码位时,服务器期望4字节的掩码出现,并且负载与

异或。
for ( size_t i=0; i<packet_len; i++ ) {
    packet[i] = payload[i] ^ mask_bits[i&3];
}

编辑:添加更多细节。

我假设你已经完成了升级握手,实际发送到网络进行通信的字节是:

[flag][mask_bit, len][extended length][mask][payload]

地点:

  • 标志:一个字节,读取手册,注意我没有尝试过片段。
  • 掩码位,位于第二字节最高位的一位。
  • len: 7位第二字节。当len为126时,实len为16位扩展长度字段。如果是127,扩展长度为64位。
  • 掩码:仅当掩码位设置时出现,它是4字节用于异或负载。
  • payload:要发送的实际字节数

例如,要以二进制模式向服务器发送"Hello",您可以这样做:

  • 标志:0x82,"帧中最后一个数据包"answers"二进制模式"
  • 掩码位:1
  • len:
  • 6
  • 掩码:0x11, 0x22, 0x33, 0x44
  • 有效载荷:"Hello",0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x00

掩码有效载荷为:0x48^0x11, 0x65^0x22, 0x6C^0x33, 0x6C^0x44, 0x6F^0x11, 0x00^0x22=> 0x59, 0x47, 0x5F, 0x28, 0x7E, 0x22

整个流是:0x82, 0x86, 0x11, 0x22, 0x33, 0x44, 0x59, 0x47, 0x5F, 0x28, 0x7E, 0x22