2017-02-07 6 views
0

ниже C фрагмент из мангуста веб-сервер обработчика HTTP событий Я работаю на:таНос мангуст веб-сервер HTTP POST тело и передать его нить

static void HttpEventHandler(struct mg_connection *nc, int ev, void *ev_data) { 
if (ev == MG_EV_HTTP_REQUEST) { 
    struct http_message *hm = (struct http_message *) ev_data; 
    if (mg_vcmp(&hm->method, "POST") == 0) { 
     pthread_t thread_id; 
     int rc; 
     rc = pthread_create(&thread_id, NULL, thr_func, /* Here I want hm body to be passed after its malloced */); 
     if (rc) { /* could not create thread */ 
      fprintf(stderr, "error: pthread_create, rc: %d\n", rc); 
      return EXIT_FAILURE; 
     } 
    }//if POST 
    mg_printf(nc, "HTTP/1.1 200 OK\r\n"); 
    nc->flags |= MG_F_SEND_AND_CLOSE; 
} 

}

HTTP-тело после сообщения, доступные в виде строки используя ниже синтаксис:

"%.*s", (int) hm->body.len,hm->body.p 

Я хочу пример кода для таНос hm-> тело и передать его на поток в фрагменте выше, также было бы здорово, чтобы объяснить, как бросить пропущенный недействительным *. если его трудно, пожалуйста, malloc ev_data или hm.

+0

, поэтому вы хотите передать строку в качестве параметра 'thr_func'? – yano

+0

Да, это будет хорошо, так как содержание тела - json. –

ответ

2

Вы бы malloc() как в:

hm->body = malloc(sizeof *(hm->body)); 
    hm->body.p = "string"; 
    /* The above assigns a string literal. If you need to copy some 
     user-defined string then you can instead do: 
    hm->body = malloc(size); strcpy(hm->body.p, str); 
    where 'str' is the string you want copy and 'size' is the length of 'str'. 
    */ 
    hm->body.len = strlen(hm->body); 

, а затем передать его:

rc = pthread_create(&thread_id, NULL, thr_func, hm->body); 

В thr_func() вам нужно будет преобразовать аргумент в любой тип hm->body, а затем доступа он (потому что void * не может быть разыменован напрямую.). Что-то вроде:

void *thr_func(void *arg) 
{ 
    struct mg_str *hm_body = arg; 
    printf("str: %s, len: %zu\n", hm_body->p, hm_body->len); 
    ... 

    return NULL; 
} 

Там нет необходимости бросать ничего void*. API pthread_create() ожидает в качестве последнего аргумента void *, а любые данные указатель может быть назначен непосредственно void *. То же самое относится и к заявлению struct http_message *hm = (struct http_message *) ev_data;. Это может быть просто: struct http_message *hm = ev_data;.

В зависимости от того, как реализован «веб-сервер», возможно, вам придется позаботиться о завершении потоков.

P.S: Если вы покажете структуру «hm», это будет намного проще объяснить.

+0

hm структура доступна здесь (отредактирована до точки): https://github.com/cesanta/mongoose/blob/master/mongoose.h#L4053 –

+0

вы можете пересмотреть ответ, hm-> тело уже заполнено данными после struct http_message * hm = (struct http_message *) ev_data; Я думаю, нам нужно malloc для новой переменной, а не hm-> body. как для размера malloc, нельзя ли использовать hm-> body.len? –

+0

Если 'hm-> body' уже заполнен, вы можете пропустить части« malloc »и передать их непосредственно на' pthread_create() ', как показано. –

 Смежные вопросы

  • Нет связанных вопросов^_^