2016-07-26 23 views
0

私はserver.threadingのデータを投稿するためにスレッディングを使用しています。データはサーバーで受信していますが、毎回セグメンテーションフォルト/コアダンプ例外がすべてのリクエストに対して受信されます。 Cコードあなたの非同期要求の完了は、現在の完了をブロックしていない場合は、RまたはR->プールを使用することはできませんApache2.2のスレッディング

int post_data_async(request_rec *r, char *host,char *encoded_data,int timout) 
{ 
apr_status_t result; 
apr_thread_t *thrd; 
apr_threadattr_t *thrdattr; 
char *final_msg; 
apr_socket_t *new_sock; 
apr_sockaddr_t *addr; 
DATA_INFO_SOCK *dt=apr_palloc(r->pool,sizeof(DATA_INFO_SOCK)); 
char *hostname=host; 
char *msg = "POST /getRequestData HTTP/1.1\r\n"\ 
      "HOST: %s\r\n" \ 
      "Accept: */*\r\n"\ 
      "Connection: keep-alive\r\n"\ 
      "Content-Length: %d\r\n"\ 
      "Content-Type: application/x-www-form-urlencoded\r\n\n%s"; 
apr_port_t port_no=80; 
apr_interval_time_t tmout=timout; 
apr_size_t *size=apr_palloc(r->pool,sizeof(apr_size_t)); 
apr_size_t *rcv=apr_palloc(r->pool,sizeof(apr_size_t)); 
final_msg=apr_psprintf(r->pool,msg,host,strlen(encoded_data),encoded_data); 
result=apr_socket_create(&dt->new_sock,APR_INET,SOCK_STREAM,APR_PROTO_TCP,r->pool); 
result=apr_sockaddr_info_get(&dt->addr,hostname,APR_INET,port_no,0,r->pool); 
result=apr_socket_connect(dt->new_sock,dt->addr); 
//result=apr_socket_timeout_set(dt->new_sock,tmout); 
*size=strlen(final_msg); 
//data preparation for thread 
dt->r=r; 
dt->resp=apr_palloc(r->pool,sizeof(char)*1024); 
dt->payload=final_msg; 
dt->len=size; 
dt->rec_len=rcv; 
result=apr_thread_create(&thrd,NULL,thread_init,(void*)dt,r->pool); 
ap_rputs("resule after thread",r); 
return 0; 
} 

答えて

0

を開始

マイスレッド関数

void* APR_THREAD_FUNC thread_init(apr_thread_t *thd,void *data) 
{ 
DATA_INFO_SOCK *dt=(DATA_INFO_SOCK*)data; 
apr_status_t result; 
result=apr_socket_sendto(dt->new_sock,dt->addr,0,dt->payload,dt->len); 
if(result==APR_SUCCESS) 
{ 
result=apr_socket_recvfrom(dt->addr,dt->new_sock,0,dt->resp,dt->rec_len); 
} 
result=apr_socket_close(dt->new_sock); 
apr_thread_exit(thd, APR_SUCCESS); 
} 

マイスレッド要求。そうしないと、メモリが再利用され、セグメンテーションが発生する可能性があります。

(それがブロック要求の完了をした場合は、それを行うにはほとんどの理由は、おそらくあります非同期)

あなたは4月コードを使用する必要がある場合は、あなたの非同期作業項目のための(非R->プールのサブプール)のプールを作成する必要がありますその中に。

+0

ソリューションに感謝。 –