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

时间:2013-01-10 15:14:11

标签: c websocket

我正在使用warmcat的libwebsocket C库作为一个小的websocket服务器。我将示例启动并运行,并且可以响应从websocket接收数据来发送数据(例如回显发送的反向字节)。但是,我还没有能够弄清楚如何从服务器异步发送数据而不必在libwebsocket回调函数中。我需要将wsi指针传递给libwebsocket_write()但是不知道如何获取指针,除非在回调中。

我已经读过libwebsocket不是线程安全的,因为我自己的经验似乎证实了。

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

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

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

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

1 个答案:

答案 0 :(得分:8)

我还没有找到一种超级干净的方法。我建议的是在服务器可以写入客户端的事件上注册回调,然后检查是否有异步工作要发送到那里。 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例子改编了这个;以上大致就是该示例以较小的块发送消息的方式。