如何将全局用户定义的结构传递给每个回调libwebsockets C

时间:2016-06-12 16:24:53

标签: c libwebsockets

我不确定这是否与lws相关但我无法找到传递全局结构的方法,该结构在回调之间保存其值。 简单的故事是我在C中有简单的哈希表 https://github.com/cgjones/android-system-core/blob/master/libcutils/hashmap.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_CALLBACK_RECEIVE
那就是失去范围。

问题:
1.如何将这个hashmap全局化为回调?它应该保留服务器的总用户数。

0 个答案:

没有答案