malloc mongoose webserver http post 主体并将其传递给线程
malloc mongoose webserver http post body and pass it to thread
下面是我正在处理的 mongoose 网络服务器 http 事件处理程序的 C 代码片段:
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
我想要 malloc hm->body 的代码示例并将其传递给上面代码段中的线程,而且如果能解释如何转换传递的 void * 也很好。如果困难,请 malloc ev_data 或 hm.
你会 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*
。 pthread_create()
API 期望 void *
作为最后一个参数和任何数据
指针可以直接赋值给void *
。这同样适用于 struct http_message *hm = (struct http_message *) ev_data;
语句。
它可以只是:struct http_message *hm = ev_data;
.
根据 "webserver" 的实现方式,您可能还需要处理线程的完成。
P.S:如果显示"hm"结构,解释起来会容易得多。
下面是我正在处理的 mongoose 网络服务器 http 事件处理程序的 C 代码片段:
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
我想要 malloc hm->body 的代码示例并将其传递给上面代码段中的线程,而且如果能解释如何转换传递的 void * 也很好。如果困难,请 malloc ev_data 或 hm.
你会 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*
。 pthread_create()
API 期望 void *
作为最后一个参数和任何数据
指针可以直接赋值给void *
。这同样适用于 struct http_message *hm = (struct http_message *) ev_data;
语句。
它可以只是:struct http_message *hm = ev_data;
.
根据 "webserver" 的实现方式,您可能还需要处理线程的完成。
P.S:如果显示"hm"结构,解释起来会容易得多。