Websocket hybi-17新数据格式c++

Posted

技术标签:

【中文标题】Websocket hybi-17新数据格式c++【英文标题】:Websocket hybi-17 new data format c++ 【发布时间】:2011-12-06 21:32:04 【问题描述】:

Websocket 协议自 8 版以来已经完全改变。现在来自浏览器的传入消息的格式非常不同,对我来说真的很复杂。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+

这是我从https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-17 发现的 有人知道如何用 C++ 或 C# 实现服务器端读取吗?或者您是否有指向已经运行的示例的链接?

我知道这个服务器是正确的,但我需要一个代码:http://websocket.org/echo.html

【问题讨论】:

【参考方案1】:

这里有一个很棒的 C++ WebSocket 库,它支持 hybi-17(最新版本),它的头文件只使用了 boost。它带有示例代码和文档: http://vinniefalco.github.io/

这是一个向回显服务器发送消息的完整程序:

#include <beast/websocket.hpp>
#include <beast/buffers_debug.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()

    // Normal boost::asio setup
    std::string const host = "echo.websocket.org";
    boost::asio::io_service ios;
    boost::asio::ip::tcp::resolver r(ios);
    boost::asio::ip::tcp::socket sock(ios);
    boost::asio::connect(sock,
        r.resolve(boost::asio::ip::tcp::resolver::queryhost, "80"));

    using namespace beast::websocket;

    // WebSocket connect and send message using beast
    stream<boost::asio::ip::tcp::socket&> ws(sock);
    ws.handshake(host, "/");
    ws.write(boost::asio::buffer("Hello, world!"));

    // Receive WebSocket message, print and close using beast
    beast::streambuf sb;
    opcode op;
    ws.read(op, sb);
    ws.close(close_code::normal);
    std::cout <<
        beast::debug::buffers_to_string(sb.data()) << "\n";

【讨论】:

【参考方案2】:

我写了一个C++ server。请参阅WsProtocol80::Read() 了解如何阅读 hybi-17 消息。请注意,服务器使用自定义字符串和套接字类,因此重用并非易事,但您应该能够轻松跟踪正在读取/写入的数据。

请随时就代码的特定部分提出任何问题。

这个wiki post 也可能感兴趣。

【讨论】:

非常感谢。这正是我所需要的。

以上是关于Websocket hybi-17新数据格式c++的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket,解码数据帧(c++)

咸鱼教程protobuf在websocket通讯中的使用

如何在 C++ 中使用 Tink 从安全的 websocket 中读取数据

如何将超过 65536 字节的二进制数据编码为 c++ 上的 websocket 帧

websocket面试题

使用 Json Python 格式化 Websocket 数据