我正在使用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 establishedn");
// 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
的例子中改编了这个;以上是该示例发送小块消息的大致操作。