Esempio n. 1
0
/*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);
}
Esempio n. 2
0
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);
}