/*when thread accept one client connection, then process it and close the connection when reaching end*/ EC_BOOL cextsrv_thread(CEXTSRV *cextsrv) { for(;;) { CEXTCLNT cextclnt; int cextclnt_sockfd; UINT32 cextclnt_ipaddr; cextclnt_init(&cextclnt); dbg_log(SEC_0069_CEXTSRV, 9)(LOGSTDOUT, "[DEBUG] cextsrv_thread: accept blocking...\n"); CEXTSRV_CMUTEX_LOCK(cextsrv, LOC_CEXTSRV_0020); if(EC_FALSE == csocket_accept(CEXTSRV_SOCKFD(cextsrv), &cextclnt_sockfd, CSOCKET_IS_BLOCK_MODE, &cextclnt_ipaddr)) { CEXTSRV_CMUTEX_UNLOCK(cextsrv, LOC_CEXTSRV_0021); dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT, "error:cextsrv_thread: accept on sockfd %d failed\n", CEXTSRV_SOCKFD(cextsrv)); continue; } CEXTSRV_CMUTEX_UNLOCK(cextsrv, LOC_CEXTSRV_0022); dbg_log(SEC_0069_CEXTSRV, 9)(LOGSTDOUT, "[DEBUG] cextsrv_thread: accept successfully\n"); CEXTCLNT_SOCKFD(&cextclnt) = cextclnt_sockfd; CEXTCLNT_IPADDR(&cextclnt) = cextclnt_ipaddr; dbg_log(SEC_0069_CEXTSRV, 9)(LOGSTDOUT, "[DEBUG] cextsrv_thread: accept connection from client %s on sockfd %d\n", c_word_to_ipv4(CEXTCLNT_IPADDR(&cextclnt)), CEXTCLNT_SOCKFD(&cextclnt)); if(EC_FALSE == cextsrv_process(cextsrv, &cextclnt)) { dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT, "error:cextsrv_thread: process request from client %s on client sockfd %d failed\n", c_word_to_ipv4(CEXTCLNT_IPADDR(&cextclnt)), CEXTCLNT_SOCKFD(&cextclnt)); cextclnt_clean(&cextclnt); continue; } //cextclnt_clean(&cextclnt);/*each client sockfd connecting and processing only once time!*/ } return (EC_TRUE); }
EC_BOOL csrv_accept_once(CSRV *csrv, EC_BOOL *continue_flag) { UINT32 client_ipaddr; EC_BOOL ret; int client_conn_sockfd; ret = csocket_accept(CSRV_SOCKFD(csrv), &(client_conn_sockfd), CSOCKET_IS_NONBLOCK_MODE, &(client_ipaddr)); if(EC_TRUE == ret) { CSOCKET_CNODE *csocket_cnode; dbg_log(SEC_0112_CSRV, 1)(LOGSTDOUT, "csrv_accept_once: handle new sockfd %d\n", client_conn_sockfd); if(0/*SWITCH_ON == CONN_KEEPALIVE_SWITCH*/)/*Jan 25,2017: csrv is for http connection*/ { if(EC_FALSE == csocket_enable_keepalive(client_conn_sockfd)) { dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_accept_once:sockfd %d enable keepalive failed, ignore!\n", client_conn_sockfd); } else { dbg_log(SEC_0112_CSRV, 9)(LOGSTDOUT, "[DEBUG] csrv_accept_once:set sockfd %d keepalive done\n", client_conn_sockfd); } } csocket_cnode = csocket_cnode_new(CMPI_ERROR_TCID, client_conn_sockfd, CSOCKET_TYPE_TCP, client_ipaddr, CMPI_ERROR_SRVPORT);/*here do not know the remote client srv port*/ if(NULL_PTR == csocket_cnode) { dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_accept_once:failed to alloc csocket cnode for sockfd %d, hence close it\n", client_conn_sockfd); csocket_close(client_conn_sockfd); return (EC_FALSE); } if(NULL_PTR != CSRV_ADD_CSOCKET_CNODE(csrv)) { CSRV_ADD_CSOCKET_CNODE(csrv)(CSRV_MD_ID(csrv), csocket_cnode); } #if (SWITCH_OFF == TASK_BRD_CEPOLL_SWITCH) if(1) { TASK_BRD *task_brd; CROUTINE_NODE *croutine_node; task_brd = task_brd_default_get(); croutine_node = croutine_pool_load(TASK_REQ_CTHREAD_POOL(task_brd), (UINT32)csrv_handle, 2, csrv, csocket_cnode); if(NULL_PTR == croutine_node) { dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_accept_once: cthread load failed\n"); csocket_cnode_close(csocket_cnode); return (EC_FALSE); } CROUTINE_NODE_COND_RELEASE(croutine_node, LOC_CSRV_0003); } #endif/*(SWITCH_OFF == TASK_BRD_CEPOLL_SWITCH)*/ #if (SWITCH_ON == TASK_BRD_CEPOLL_SWITCH) /*note: CSOCKET_CNODE_PKT_HDR will be used for specific purpose*/ BSET(CSOCKET_CNODE_PKT_HDR(csocket_cnode), 0, CSOCKET_CNODE_PKT_HDR_SIZE); CSOCKET_CNODE_MODI(csocket_cnode) = CSRV_MD_ID(csrv); cepoll_set_event(task_brd_default_get_cepoll(), CSOCKET_CNODE_SOCKFD(csocket_cnode), CEPOLL_RD_EVENT, (CEPOLL_EVENT_HANDLER)CSRV_RD_EVENT_HANDLER(csrv), (void *)csocket_cnode); cepoll_set_complete(task_brd_default_get_cepoll(), CSOCKET_CNODE_SOCKFD(csocket_cnode), (CEPOLL_EVENT_HANDLER)CSRV_COMPLETE_HANDLER(csrv), (void *)csocket_cnode); cepoll_set_shutdown(task_brd_default_get_cepoll(), CSOCKET_CNODE_SOCKFD(csocket_cnode), (CEPOLL_EVENT_HANDLER)CSRV_CLOSE_HANDLER(csrv), (void *)csocket_cnode); cepoll_set_timeout(task_brd_default_get_cepoll(), CSOCKET_CNODE_SOCKFD(csocket_cnode), CSRV_TIMEOUT_NSEC(csrv), (CEPOLL_EVENT_HANDLER)CSRV_TIMEOUT_HANDLER(csrv), (void *)csocket_cnode); #endif/*(SWITCH_ON == TASK_BRD_CEPOLL_SWITCH)*/ } (*continue_flag) = ret; return (EC_TRUE); }