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

我使用warmcat的libwebsocket C库作为一个小的websocket服务器。 我已经将示例启动并运行,并且可以发送数据以响应从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

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