0

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

4

1 回答 1

0

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

从猫鼬文档mg_wakeup_server_ex

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

由于它使用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 创建的。

于 2014-08-25T19:46:22.023 回答