gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:41:32 26 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

关于c - 如何通过 libwebsocket 发送异步数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com