Mg_wakeup_server_ex()回调没有被调用,而使用猫鼬5.4
mg_wakeup_server_ex ( ) callback not getting called while using mongoose 5.4
我正在使用猫鼬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 NULLn");
}
return ;
}
在这里,当mg_wakeup_server_ex()被调用时,回调不会被调用。我不怀疑c++方法调用c方法,因为它在少数情况下有效。只有在某些地方,websocket_data_push()回调不会被调用。你能帮帮我吗? !
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 NULLn");
}
}
如果你想使用mg_wakeup_server_ex,你应该从线程中调用它,例如使用mg_start_thread创建的。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 复制文件时如何调用取消?(使用复制文件 ex 函数和复制进度例程回调函数)