[Libwebsockets] struct lws_context_creation_info user is not reachable in LWS_CALLBACK_WS_PEER_INITIATED_CLOSE and LWS_CALLBACK_SERVER_WRITEABLE

Meir Yanovich meiry242 at gmail.com
Sat Jun 18 13:58:03 CEST 2016


Will do



‫ב-18 ביוני 2016, בשעה 12:07, ‏‏Andy Green ‏<andy at warmcat.com> כתב/ה:‬



> On June 18, 2016 3:48:52 PM GMT+08:00, Meir Yanovich <meiry242 at gmail.com> wrote:
> Please ignore the question i found the problem , it was in my code .

Generally it's really helpful if problem reports are related to the generic test apps somehow.

- it'll expose the relationship between the problem and your code if you try to adapt a test app to demonstrate the same problem and it works

- if you can demonstrate the same problem with a modified lws test app, I stand a chance of reproducing and fixing it with a small patch

-Andy

> 
> On Sat, Jun 18, 2016 at 12:43 AM, Meir Yanovich <meiry242 at gmail.com>
> wrote:
> 
>> Hello
>> im realy confused , i try to pass user data which is simple hash map
>> implementation
>> in my main : ( i tried with or without the static )
>> 
>> static Hashmap *users_map_main;
>> 
>> int main(int argc, char **argv)
>> {
>> struct lws_context_creation_info info;
>> const char *iface = NULL;
>> int opts = 0;
>> int server_port = 3000;
>> 
>> users_map_main = hashmapCreate(10, str_hash_fn, str_eq);
>> 
>> memset(&info, 0, sizeof info);
>> ...
>> ...
>> info.user = users_map_main;
>> ...
>> ...
>> }
> -----------------------------------------------------------------------------------------------------------
>> Then in the callback C file the user data passed just fine on
>> : LWS_CALLBACK_ESTABLISHED and on LWS_CALLBACK_RECEIVE
>> so i know that my user  data did pass throw
>> 
>> but the wired thing is that latter on the same connection single user
>> connected on LWS_CALLBACK_SERVER_WRITEABLE
>> 
>> and when user close connection LWS_CALLBACK_WS_PEER_INITIATED_CLOSE
>> 
>> the user data pointer is gone and it is not pointing any where .
>> 
>> this is my shortened callback file :
> ------------------------------------------------------------------------------------------------------------
>> extern int debug_level;
>> static list_declare(users);
>> connection_num_as_id = 0;
>> 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__iogame *pss =
>> (struct per_session_data__iogame *)user;
>> unsigned char *response_string_out = &out[LWS_PRE];
>> int n;
>> int m;
>> 
>> switch (reason) {
>> 
>> case LWS_CALLBACK_ESTABLISHED:
>> users_map = (Hashmap*)lws_context_user(lws_get_context(wsi));
>> int after = hashmapSize(users_map);
>> pss->recive_all_from_client = 0;
>> pss->wsi_user = malloc(sizeof pss->wsi_user);
>> pss->wsi_user = wsi;
>> connection_num_as_id++;
>> 
>> break;
>> 
>> case LWS_CALLBACK_SERVER_WRITEABLE:
>> {
>> cJSON *root;
>> char *resp_json;
>> int n, m;
>> if (pss->recive_all_from_client == 1)
>> {
>> 
>>  root = cJSON_CreateObject();
>> cJSON_AddItemToObject(root, "name", cJSON_CreateString(pss->name));
>> resp_json = cJSON_Print(root);
>> n = sprintf((char *)response_string_out, "%s", resp_json);
>> m = lws_write(pss->wsi_user/*wsi*/, response_string_out, n,
>> LWS_WRITE_TEXT);
>> if (m < n) {
>> lwsl_err("ERROR %d writing to the socket\n", sizeof(out));
>> return -1;
>> }
>> }
>> break;
>> }
>> case LWS_CALLBACK_RECEIVE:
>> {
>> char* client_req_str;
>> 
>> cJSON *root;
>> char *resp_json;
>> 
>> if (len <=0)
>> {
>> break;
>> }
>> client_req_str = (char*)in;
>> cJSON * user_root = cJSON_Parse(client_req_str);
>> cJSON * user_type = cJSON_GetObjectItem(user_root, "type");
>> cJSON * user_name = cJSON_GetObjectItem(user_root, "name");
>> if (strncmp((const char *)user_type->valuestring, "player\n", 6) ==
> 0)
>> {
>> pss->recive_all_from_client = 1;
>> pss->name = malloc(1 + strlen(user_name->valuestring));
>> strcpy(pss->name, user_name->valuestring);
>> int bfor  = hashmapSize(users_map);
>> hashmapPut(users_map, pss->id, pss);
>> int after = hashmapSize(users_map);
>> int stop = 1;
>> }
>> //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:
>> {
>> users_map = (Hashmap*)lws_context_user(lws_get_context(wsi));
>> int after = hashmapSize(users_map);
>> int after = hashmapSize(users_map);
>> hashmapRemove(users_map, pss->id);
>> break;
>> }
>> case LWS_CALLBACK_CLOSED:
>> {
>> lwsl_notice("LWS_CALLBACK_CLOSED: len %d\n",
>> len);
>> for (n = 0; n < (int)len; n++)
>> lwsl_notice(" %d: 0x%02X\n", n,
>> ((unsigned char *)in)[n]);
>> break;
>> }
>> default:
>> break;
>> }
>> 
>> return 0;
>> }
>> 
>> 
>> Thanks!
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Libwebsockets mailing list
> Libwebsockets at ml.libwebsockets.org
> http://libwebsockets.org/mailman/listinfo/libwebsockets

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://libwebsockets.org/pipermail/libwebsockets/attachments/20160618/9e449e88/attachment-0001.html>


More information about the Libwebsockets mailing list