我有自己的套接字实现,它支持来自常规tcp客户端的连接。现在我想在我的服务器程序中添加对websocket的支持。在这种情况下,我需要支持主要网络浏览器支持的握手和消息帧协议。我能够处理握手的部分,但却被困在处理信息的框架和取消框架上。是否有任何现有的C或C++库处理websocket消息帧的编码和解码,并支持主要网络浏览器使用的主要websocket协议?
我发现的大多数当前实现(即libwebsocket、websockettpp等)都实现了自己的服务器和客户端库,这意味着我需要使用它们的套接字实现。我不想这么做,因为这需要我修改当前程序中的很多内容,而且这对我来说不是一个选项。我需要的只是一个简单的库,它可以处理websocket帧的编码和解码(和/或还可以处理握手部分,但这不是强制性的)。
Websocketpp库作者。
帧处理和握手处理代码与套接字/网络代码完全分离。查看策略重构分支的处理器文件夹。有一个用于草案76(hybi_legacy),一个用于RFC6455(hybi/hybi_header)。帧处理器从STL流中读取,您可以通过自己的网络代码或其他来源填充该STL流。
如果你有任何更具体的问题,请在github上给我发一个PM。
websocketpp
库设计得很好,帧处理类没有与套接字类混合。存在对BOOST和STL库的依赖。STL不是问题,BOOST依赖关系很容易避免。只需从策略重构分支的websocket_frame.hpp文件开始。
帧c语法分析器(无握手)您可能会在
您现在可以使用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_forr();以轮询特定时间。
它最终会看起来像:
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
}
}