如何将全局用户定义结构传递给每个回调libwebsockets C
我不确定这是否与lws有关,但我就是找不到方法来传递在回调之间保存其值的全局结构。 简单的故事是,我在C中有一个简单的哈希表 我试图在示例中解释: 我的主要意见是:如何将全局用户定义结构传递给每个回调libwebsockets C,c,libwebsockets,C,Libwebsockets,我不确定这是否与lws有关,但我就是找不到方法来传递在回调之间保存其值的全局结构。 简单的故事是,我在C中有一个简单的哈希表 我试图在示例中解释: 我的主要意见是: //HERE I DEFINE IT AS GLOBAL Hashmap *users_map; static struct lws_protocols protocols[] = { { "wsapi", callback_wsapi, sizeof(struct
//HERE I DEFINE IT AS GLOBAL
Hashmap *users_map;
static struct lws_protocols protocols[] = {
{
"wsapi",
callback_wsapi,
sizeof(struct per_session_data__apigataway),
128,
} ,
{ NULL, NULL, 0, 0 } /* terminator */
};
int main(int argc, char **argv)
{
struct lws_context_creation_info info;
//HERE i init the hash map
users_map = hashmapCreate(10, str_hash_fn, str_eq);
memset(&info, 0, sizeof info);
info.port = server_port;
info.protocols = protocols;
...
info.options = opts | LWS_SERVER_OPTION_LIBUV;
context = lws_create_context(&info);
if (lws_uv_initloop(context, NULL, 0)) {
lwsl_err("lws_uv_initloop failed\n");
goto bail;
}
uv_timer_init(lws_uv_getloop(context, 0), &timeout_watcher);
uv_timer_start(&timeout_watcher, main_loop_count_callback, 1000, 1000);
lws_libuv_run(context, 0);
return 0;
}
这是我删除的callback_wsapi C文件,代码分配只是为了显示重要的内容
//HERE I SET IT AS EXTERN SO IT WILL BE VISIBLE TO ALL
extern Hashmap *users_map;
int
callback_iogame(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
unsigned char out[LWS_PRE + 512];
struct per_session_data__apigataway *pss =
(struct per_session_data__apigataway *)user;
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
break;
case LWS_CALLBACK_SERVER_WRITEABLE:
{
//HERE IT LOSSING SCOPE AND THE HASHMAP NOT INITIALIZED
int bfor2 = hashmapSize(users_map);
break;
}
case LWS_CALLBACK_RECEIVE:
{
char* client_req_str;
client_req_str = (char*)in;
if (strncmp((const char *)client_req_str, "player\n",6) == 0)
{
//ON THE FIRST REQUEST FROM THE CLINET IT WORKS
int bfor = hashmapSize(users_map);
hashmapPut(users_map, pss->id, pss);
int after = hashmapSize(users_map);
}
//Only invoke callback back to client when baby client is ready to eat
lws_callback_on_writable(wsi);
break;
}
case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION:
break;
case LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:
break;
default:
break;
}
因此,我只能在第一个请求到达时获取hashmap:LWS\u CALLBACK\u RECEIVE然后它就失去了范围 问题:
1.如何使此哈希映射成为回调的全局映射?它应该容纳服务器的所有用户。你所说的“然后它就失去了作用域”是什么意思?全局变量不能超出范围,它的生命周期就是程序的生命周期。实际代码是否定义了更多全局内容,通常与
user\u map
指针定义在同一个模块中?是的,有一些原始全局变量设置一次,我可以从其他文件获取值:如main:int debug\u level=7;在其他文件中是:extern int debug_level;你所说的“那么它只是失去了范围”是什么意思?全局变量不能超出范围,它的生命周期就是程序的生命周期。实际代码是否定义了更多全局内容,通常与user\u map
指针定义在同一个模块中?是的,有一些原始全局变量设置一次,我可以从其他文件获取值:如main:int debug\u level=7;在其他文件中是:extern int debug_level;