Я работаю с Мангуст 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 () не вызывается.
Не могли бы вы помочь, пожалуйста!
mg_wakeup_server_ex пробуждает поток сервера, один вызов mg_poll_server.
Из документации мангуста mg_wakeup_server_ex :
Отправляет строковое сообщение на сервер. Функция func вызывается для каждого
активное соединение. Строковое сообщение передается в структуре
mg_connection :: callback_param. Эта функция предназначена для передачи данных
к подключенным клиентам, и может быть вызван из любого потока. Есть
ограничение на длину сообщения, в настоящее время составляет 8 килобайт.
Поскольку он использует сокет-сокет для связи, он заблокируется, если вы вызовете его из потока сервера. В таком случае вы должны заменить на 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.