gpt4 book ai didi

c++ - 使用 mongoose 5.4 时未调用 mg_wakeup_server_ex () 回调

转载 作者:行者123 更新时间:2023-11-30 17:30:51 24 4
gpt4 key购买 nike

我正在使用 Mongoose 5.4下面是代码行

char* eventToOCC = NULL;

static int websocket_data_push(struct mg_connection *conn, enum mg_event ev)
{
if ((ev == MG_POLL) && (NULL != conn->uri) && (NULL != eventToOCC))
{
if (strcmp(conn->uri, "/web") == 0 && conn->is_websocket) {
mg_websocket_printf(conn, WEBSOCKET_OPCODE_TEXT, "%s",
eventToOCC);
}
}
return MG_FALSE;
}


void SampleClass::sendEventsToClinet(char* evString)
{
if(evString != NULL)
{
eventToOCC = evString;
printf("EVENT SENT is ---%s---\n",evString);
mg_wakeup_server_ex(mgserver, websocket_data_push, "%lu %s",
(unsigned long) time(NULL), (const char *) evString);
}
else
{
printf("Connection Pointer is NULL\n");
}
return ;
}

这里,每当调用 mg_wakeup_server_ex() 时,回调都不会被调用。我不怀疑 C++ 方法调用 C 方法,因为它在少数情况下有效。仅在某些地方,不会调用 websocket_data_push () 回调。你能帮忙吗!!!

最佳答案

mg_wakeup_server_ex 唤醒服务器线程,其中调用mg_poll_server。

来自 Mongoose 文档 mg_wakeup_server_ex :

Sends string message to a server. Function func is called for every active connection. String message is passed in struct mg_connection::callback_param. This function is designed to push data to the connected clients, and can be called from any thread. There is a limitation on the length of the message, currently at 8 kilobytes.

由于它使用socketpair进行通信,如果从服务器线程调用它会死锁。在这种情况下,您应该替换为 mg_iterate_over_connections。

你的代码将变成这样:

static int websocket_data_push(struct mg_connection *conn, enum mg_event ev)
{
const char* msg = (const char*)conn->callback_param;
if ((ev == MG_POLL) && (NULL != conn->uri) && (NULL != msg))
{
if (strcmp(conn->uri, "/web") == 0 && conn->is_websocket)
{
mg_websocket_printf(conn, WEBSOCKET_OPCODE_TEXT, msg);
}
}
return MG_FALSE;
}
void SampleClass::sendEventsToClient(const char* evString)
{
if(evString != NULL)
{
char msg[8*1024];
snprintf(msg, sizeof(msg),"%lu %s", (unsigned long) time(NULL), evString);
mg_iterate_over_connections(mgserver, websocket_data_push,(void*)&msg);
}
else
{
printf("Connection Pointer is NULL\n");
}
}

如果您想使用 mg_wakeup_server_ex,您应该从线程中调用它,例如使用 mg_start_thread 创建的线程。

关于c++ - 使用 mongoose 5.4 时未调用 mg_wakeup_server_ex () 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24903443/

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