如何通过 libwebsocket 发送异步数据?

Posted

技术标签:

【中文标题】如何通过 libwebsocket 发送异步数据?【英文标题】:How do I send async data via libwebsocket? 【发布时间】:2013-01-10 15:14:10 【问题描述】:

我正在为小型 websocket 服务器使用 warmcat 的 libwebsocket C 库。我已经启动并运行了示例,并且可以发送数据以响应从 websocket 接收数据(例如回显发送的反向字节)。但是,我无法弄清楚如何在没有进入 libwebsocket 回调函数的情况下从服务器异步发送数据。我需要将 wsi 指针传递给 libwebsocket_write() 但除了在回调中之外,我看不到如何获取指针。

我已经读到 libwebsocket 不是线程安全的,我自己的经验似乎证实了这一点。

在 libwebsockets.c:line2483 中,我读到“协议回调函数 [...] 定期调用以允许异步传输。”这正是我想要的,但我没有在我自己的代码中观察到这种情况发生,也没有找到任何方法来“打开它”。

关于如何异步写入我正在服务的 websocket 的建议?

libwebsocket 代码:http://git.warmcat.com/cgi-bin/cgit/libwebsockets/

使用示例:http://martinsikora.com/libwebsockets-simple-websocket-server

【问题讨论】:

【参考方案1】:

我还没有找到一种超级干净的方法来做到这一点。我的建议是在服务器可以写入客户端的事件上注册一个回调,然后检查是否有异步工作要发送到那里。 LWS_CALLBACK_SERVER_WRITEABLE 事件就是这样,如果您在回调中调用 libwebsocket_callback_on_writable(context, wsi);,它将被定期调用。

所以,是这样的:

static int callback_myprotocol(struct libwebsocket_context *context,
                               struct libwebsocket *wsi,
                               enum libwebsocket_callback_reasons reason,
                               void *user, void *in, size_t len)

    SendState *ss = (SendState*)user;

    switch (reason) 
    case LWS_CALLBACK_ESTABLISHED: 
        printf("connection established\n");
        // get the ball rolling
        libwebsocket_callback_on_writable(context, wsi);
        break;

    case LWS_CALLBACK_SERVER_WRITEABLE: 
        if (!work_to_be_done) 
            // schedule ourselves to run next tick anyway
            libwebsocket_callback_on_writable(context, wsi);
            return 0;
        
        // send our asynchronous message
        libwebsocket_write(wsi, buf, size, flag);
        // and schedule ourselves again
        libwebsocket_callback_on_writable(context, wsi);
        break;
    
    default:
        break;
    

    return 0;

我改编自 test-fraggle.c 示例;以上大致是该示例以较小的块发送消息的方式。

【讨论】:

对于编写 C WebSocket 客户端而不是服务器的任何人,调用 LWS_CALLBACK_CLIENT_WRITEABLE 事件而不是 LWS_CALLBACK_SERVER_WRITEABLE

以上是关于如何通过 libwebsocket 发送异步数据?的主要内容,如果未能解决你的问题,请参考以下文章

libwebsocket:发送有效负载有限的大消息

libwebsocket协议切换状态机

使用libwebsockets搭建一个简单的websocket服务器

使用libwebsockets搭建一个简单的websocket服务器

如何在 Ubuntu 中安装 libwebsocket 库?

Libwebsocket 客户端示例