Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将全局用户定义结构传递给每个回调libwebsockets C_C_Libwebsockets - Fatal编程技术网

如何将全局用户定义结构传递给每个回调libwebsockets 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

我不确定这是否与lws有关,但我就是找不到方法来传递在回调之间保存其值的全局结构。 简单的故事是,我在C中有一个简单的哈希表

我试图在示例中解释: 我的主要意见是:

//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;