使用mongoose 5.4时不会调用mg_wakeup_server_ex()回调

时间:2014-07-23 06:38:52

标签: c++ c callback mongoose-web-server

我正在使用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()回调才会被调用。 你能帮忙!!!

1 个答案:

答案 0 :(得分:0)

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 NULL\n");
    }
}

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