Mg_wakeup_server_ex()回调没有被调用,而使用猫鼬5.4

mg_wakeup_server_ex ( ) callback not getting called while using mongoose 5.4

本文关键字:调用 ex server wakeup Mg 回调      更新时间:2023-10-16

我正在使用猫鼬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 NULLn");
    }
    return ;
}

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

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

来自mongoose文档mg_wakeup_server_ex:

向服务器发送字符串消息。函数func被调用活动连接。字符串消息在struct中传递mg_connection:: callback_param。这个函数是用来推送数据的到连接的客户端,并且可以从任何线程调用。有对消息长度的限制,目前为8千字节。

由于它使用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 NULLn");
    }
}

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