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

C++ 使用mongoose 5.4时未调用mg_wakeup_server_ex()回调,c++,c,callback,mongoose-web-server,C++,C,Callback,Mongoose Web Server,我正在使用猫鼬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->ur

我正在使用猫鼬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\u data\u push回调不会被调用。
你能帮忙吗

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

来自mongoose文档:

向服务器发送字符串消息。函数func是为每个 主动连接。字符串消息在结构中传递 mg_连接::回调_参数。此功能旨在推送数据 连接到已连接的客户端,并且可以从任何线程调用。有 对消息长度的限制,当前为8 KB

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

您的代码将类似于:

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_线程创建的线程。

什么是C方法?你怎么知道回调没有被调用?我在websocket\u data\u push函数中有一些打印。这是一个不属于SampleClass类的C函数。这些指纹没有打印出来。我看到的唯一打印是发送的事件-**。而不是websocket_data_push中的函数只是为了澄清,如果函数不在C源文件中或标记为extern C,则该函数不是C函数。如果它在全局范围内,它是全局静态C++函数,如果它在一个类中,它是C++静态成员函数。对于您的问题,您确信调用回调的事件是否真的发生了?您还应该尝试在调试器中运行,并在websocket\u data\u push上设置一个断点,以查看它是否停止在那里。是的,我非常确定回调会被调用,因为它工作了2/3次。它仅在某些用例中不起作用。如果我发送正确的返回值,我怀疑这完全是与猫鼬有关的问题。这就是为什么我想知道回调没有被调用的可能性