【问题标题】:C++ Websocket server initiated dataC++ Websocket 服务器发起的数据
【发布时间】:2017-06-08 06:05:31
【问题描述】:

我需要在 Linux 上运行的 C++ 代码上实现 websocket 服务器。 有时,我还需要将数据异步推送到客户端。

到目前为止,我已经尝试过野兽回声服务器、libwebsocket 测试服务器和 libonion(一旦尝试从浏览器连接时出现错误,它就会崩溃 “如果未编译 gnutls,则无法计算 SHA1!现在中止”。但是,我还没有想出任何可以建立的东西。

下面我试图通过虚拟测试类提供更多信息。

test.cpp
class test
{
public:
void processDataFromClient(const string & data);//this needs to get filled by websocket read method? how?
void pushDataToClient(const string & data);

};
test::pushDataToClient(const string & data)
{
(socketId, text) // how do I call this from my test.cpp ?
}

test::void processDataFromClient(const string & data)
{
//do some computation based on the text received
//turn on the light
//once Light is on for a minute call
pushDataToClient( lighton) ;
}

//websocket_server.cpp 
main
{
//open a webSocket
//listen for messages from client i.e pass data received from onion_websocket_read to test class by calling processDataFromClient();
//send asynchronous messages to client received from test class. i.e. pushDataToClient should invoke onion_websocket_write //do we need a thread for this ? how to achieve this?

}

我正在寻找一个简单的接口,它可以让我启动一个 websocket,异步接收和发送数据到客户端/从客户端发送数据。

【问题讨论】:

    标签: c++ linux websocket server


    【解决方案1】:

    我需要在 Linux 上运行的 C++ 代码上实现服务器以 支持 Angular JS 客户端。有哪些可用选项?我可以吗 使用 C++ 通过原始套接字实现服务器、boost-asio 服务器、CGI 基于服务器支持、REST 服务器或有更好/更快的 选项。我以前从未实施过,也不知道 每个选项的缺点/优点。我从未编写过 CGI 和 REST api 之前。让我知道你的 cmets。

    也许我误解了你的问题,但你是在谈论用 C++ 重写某种基于套接字的 Apache(或 nodejs)吗? AngularJS 是一个在浏览器中运行的框架。当您说“支持 Angular JS 客户端”时,您的意思是使用 C++ 为基于 HTML/HTTP 的应用程序提供服务?这将包括其他框架和基于 JavaScript 的实现。

    如果这是要求,我不会从头开始这样做。这是一项艰巨的任务。有一些项目可供您使用和构建。

    这里有几个参考:

    https://softwareengineering.stackexchange.com/questions/53624/can-c-be-used-as-a-server-side-web-development-language How to use C++ for apache server

    编辑:基于下面的 cmets,也许是这些解决方案之一?它们是使您能够从 Node/Apache 调用 C++ 程序的模块:

    How can I use a C++ library from node.js?
    Forwarding apache request to a c++ program

    【讨论】:

    • 我有一个使用 AngularJS 开发的 GUI/客户端,它将向 Linux 上运行的 C++ 代码发送 HTTP 请求。我需要解析这些请求并将响应发送给客户端。我很快查看了您发送的链接,但由于它没有指定特定的解决方案,因此对我来说也非常不知所措。我认为您是在建议一个基于 C++ 的服务器框架,我不必从头开始。如果是这样,您能否建议提供更多信息的步骤?
    • 我建议了一个 C++ 服务器框架,因为这正是您所要求的。鉴于您正在使用 Angular,您必须了解一些 JavaScript。也许首先看看 Nodejs,看看你是否可以编写 C++ 片段来插入?当然,还有 Apache,也就是 Java。
    • 我遇到了这个 C++ 框架。 github.com/corvusoft/restbed 不确定,我是否应该使用它。请让我知道你的 cmets。
    【解决方案2】:

    您首先需要深入了解HTTPWebSockets,以及两者之间的密切关系。花几个星期来研究这两个。你可能还需要了解HTML5 & JavaScript & AJAX

    (因此您可能需要先花几个月的时间了解所有这些主题;您可以找到几本与它们相关的书籍和网站。)

    最好使用一些提供 WebSocket 支持的 C 和 C++ HTTP 服务器库。就像例如libonion(也许还有Wt,但我不确定它是否支持WebSockets。)。 libonion 有一个example for websocket(当然你需要一个最近的快照)。

    在花了一些时间(也许几个月,几天还不够)理解很好 HTTP 和 WebSockets 之后,你可能会意识到你应该实现一个 C++ 服务器程序来处理两者 HTTP 和 WebSockets。仅仅拥有一个“简单”的 C++ 程序并且只做 WebSockets——而不处理 HTTP——可能是没有意义的,而且肯定是没有用的。但是,您使用 C++ 编写的专用 HTTP+WebSocket 服务器程序可能会从通用 Web 服务器转发一些请求(请参阅proxy servers)。

    另请参阅Comparison of WebSockets implementations 维基页面。

    【讨论】:

    • libonion 确实支持 websocket。我用它来达到这个目的。您需要该库的最新快照
    • 我对 websocketpp 库的 simple-web-server 代码进行了一些更改以获得所需的行为。 github.com/zaphoyd/websocketpp
    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2012-08-10
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多