4

我有自己的套接字实现,支持来自常规 tcp 客户端的连接。现在我想在我的服务器程序中添加 websocket 支持。在这种情况下,我将需要支持主要 Web 浏览器支持的握手和消息框架协议。我能够处理握手部分,但被困在处理消息的框架和取消框架中。是否有任何现有的 C 或 C++ 库来处理 websocket 消息帧的编码和解码,并支持主要 web 浏览器使用的主要 websocket 协议?

我发现的大多数当前实现(即 libwebsocket、websocketpp 等)都实现了自己的服务器和客户端库,这意味着我需要使用他们的套接字实现。我不想这样做,因为这将需要我在当前程序中修改很多东西,而且这不是我的选择。我需要的只是一个简单的库来处理 websocket 帧的编码和解码(和/或还处理握手部分,但这不是强制性的)。

4

4 回答 4

6

Websocketpp 库作者在这里。

帧处理和握手处理代码与套接字/网络代码完全分开。查看策略重构分支的处理器文件夹。有一个用于草案 76 (hybi_legacy) 和一个用于 RFC6455 (hybi/hybi_header)。帧处理器从 STL 流中读取,您可以通过自己的网络代码或其他来源填充​​该流。

如果您有任何更具体的问题,请在 github 上给我发送 PM。

于 2012-03-10T00:12:03.810 回答
5

websocketpp库设计精美,帧处理类没有与套接字类混合。依赖于 BOOST 和 STL 库。STL 不是问题,BOOST 依赖很容易避免。只需从策略重构分支的websocket_frame.hpp文件开始。

于 2012-03-03T10:45:42.300 回答
1

您可能会在那里找到 Frame c-parser(无握手)

于 2019-05-08T13:35:05.663 回答
0

您现在可以使用 boost 来运行异步非阻塞 ssl websocket 连接。检查这个例子:

https://github.com/boostorg/beast/blob/develop/example/websocket/client/async-ssl/websocket_client_async_ssl.cpp

而不是调用 ios.run(); 就像在示例中一样,使用您自己的 for 循环(来自您的网络代码)并调用 ioc.poll();

websocket 连接将在后台完全处理并将事件传递给回调类。所有事件都是异步且非阻塞的。并将与您的网络代码完美运行。还有额外的轮询调用,如 ioc.poll_for(); 轮询特定的时间。

它最终看起来像:

  int main()
  {
    net::io_context ioc;
    
    ssl::context ctx{ssl::context::tlsv12_client};
    
    load_server_certificate(ctx);
    // create the instance of the boost::asio websocket client
    auto websock = std::make_shared<session>(ioc, ctx);
    websock->run("gateway.discord.gg", "443", "");

    // create a server from your own networking code;
    auto server = MyLibrary->createSomeAsynchNonBlockingServer("3455", &my_librariies_event_handler);
    
    while(MyLibrary->running)
    {
        if(MyLibrary->eventHandler()->proccessServer())
            server->acceptClient(); // accept normal connection from your libraries server
            
        ioc.poll(); // poll the boot::asio::io_context for any eventHandlers that have waiting events This function is non-blocking
    }        
  }
于 2021-11-15T22:44:41.007 回答