Обратный вызов mg_wakeup_server_ex () не вызывается при использовании mongoose 5.4

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() не вызван. Не могли бы вы помочь?

  • 0
    Какой "метод C"? Откуда ты знаешь, что обратный вызов не вызывается?
  • 0
    У меня есть определенные отпечатки в функции websocket_data_push (). Это функция C, которая не принадлежит классу SampleClass. Эти отпечатки не распечатываются. Единственный отпечаток, который я вижу - «СОБЫТИЕ ОТПРАВЛЕНО - **». а не тот, что в websocket_data_push ()
Показать ещё 5 комментариев
Теги:
callback
mongoose-web-server

1 ответ

0

mg_wakeup_server_ex пробуждает поток сервера, один вызов mg_poll_server.

Из документации мангуста mg_wakeup_server_ex:

Отправляет строковое сообщение на сервер. Функция func вызывается для каждого активного соединения. Сообщение String передается в 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню