noPoll Websocket非阻塞处理程序

时间:2019-08-23 12:38:23

标签: c++ c websocket libwebsockets

我们正在编写一个使用Websocket的C ++应用程序。由于它是在嵌入式系统中使用的,因此我们使用轻量级的 noPoll C库。如果您以阻止方式进行操作,那么一切都会很好:

 ctx = nopoll_ctx_new();
 listener = nopoll_listener_new(ctx, HOST.c_str(), PORT.c_str());

    //pass 'this' pointer to functions so they could access Websocket class members
    nopoll_ctx_set_on_msg(ctx, listener_on_message, this);
    nopoll_ctx_set_on_open(ctx, listener_on_open, this);
    nopoll_ctx_set_on_accept(ctx, listener_on_accept, this);

    //this function blocks the caller. Listens for events
    nopoll_loop_wait(ctx, 1);

而且,这很糟糕。我们还有许多需要高频处理的外围设备,并且此功能会阻塞所有内容(500毫秒)。我设法编写了一个简单的websocket处理程序函数,该函数在我的main while(true)循环中调用:

 void Websocket::handler() {
    noPollConn *conn = nopoll_conn_accept(ctx, listener);
    if (conn) {
        nopoll_conn_complete_handshake(conn);
        //there I store the connected connections
        conns.push_back(conn);
    }
    //CHECK IN EVERY CONNECTION IF THERE ARE ANY MESSAGES
    //...loop through connections
 }

如前所述,这个简单的处理程序在main while(true)循环中被调用并且可以正常工作。但是问题在于,现在我找不到任何方法来检查连接是否已关闭(用户已断开连接)。函数nopoll_conn_is_ok(noPollConn *conn)始终返回true

问题是,是否至少有可能编写某种non-blocking Websocket处理程序?其他C / C ++库(例如 websocket ++ libwebsocket )具有相同的实现方式,但具有阻塞方式。也许有人有自己的实现?

0 个答案:

没有答案