用于编码和解码WebSocket帧的C或C++库

4
我有自己的套接字实现,支持正常TCP客户端的连接。现在我想在我的服务器程序中添加WebSocket支持。在这种情况下,我需要支持主要Web浏览器所支持的握手和消息帧协议。我已经能够处理握手部分,但在处理消息的帧与解桢时遇到了困难。是否存在任何现有的C或C ++库来处理WebSocket消息帧的编码和解码,并支持主流Web浏览器使用的主要WebSocket协议?
我找到的大多数当前实现(例如libwebsocket、websocketpp等)都是实现它们自己的服务器和客户端库,这意味着我需要使用它们的套接字实现。我不想这样做,因为这将需要我修改当前程序中的许多东西,而且这对我来说不是一个选项。我需要的只是一个简单的库,用于处理WebSocket帧的编码和解码(及/或处理握手部分,但这不是强制性要求)。

1
phpws移植怎么样?代码看起来非常简单明了。 - Chikei
4个回答

6

我是Websocketpp库的作者。

帧处理和握手处理代码完全独立于套接字/网络代码。请查看policy-refactor分支的processors文件夹。其中一个是针对草案76(hybi_legacy)的,另一个是针对RFC6455(hybi/hybi_header)的。帧处理器从你自己的网络代码或其他来源填充的STL流中读取。

如果您有任何更具体的问题,请在github上私信我。


5
请在此处使用评论提出任何更多的问题,这样其他人也可以从中学习。 - user1203803

5

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


1

无握手协议的框架c-parser,您可以在这里找到


欢迎来到StackOverflow!请提供代码示例而不仅仅是答案的参考。我们有关于如何撰写好的回答的指南。 - Joseph Cho

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
    }        
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接