2017-02-07 5 views
0

をスレッドに渡し、私はに取り組んでいますマングースWebサーバのHTTPイベントハンドラからCの抜粋です:のmallocマングースWebサーバーの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 POSTメッセージのボディ、構文の下に使用して:

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

私はコードサンプルがHM->体をmallocと上記のスニペット内のスレッドにそれを渡したい、また*渡された空間をキャストする方法を説明するために素晴らしいことです。その難しい場合は、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); 

し、その後にそれを渡す:あなたはhm->bodyの種類と、アクセス何に引数を変換する必要がありますthr_func()

rc = pthread_create(&thread_id, NULL, 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*に何かをキャストする必要はありません。 pthread_create() APIは最後の引数として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

あなたは答えを改訂してください。構造体http_message * hm =(構造体http_message *)の後ev_data;私は、hm-> bodyではなく、新しい変数にmallocする必要があると思います。 mallocのサイズについては、hm-> body.lenを使用することはできませんか? –

+0

'hm-> body'が既に埋め込まれている場合は、" malloc "部分をスキップして、それを' pthread_create() 'に直接渡すことができます。 –

関連する問題