我正在使用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 :(得分: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创建。