libevent显式调用事件处理

        while (1)
        {
                SearchAcceptListen2(p_ev_arg->listen_fd,0,&notify_event,base);
                event_base_loop(base, EVLOOP_NONBLOCK);
        }    

 

其中调用函数的实现是

void SearchAcceptListen2(int fd, short what, void *arg, struct event_base *p_base)
{
        struct event *p_ev = (struct event *)arg;
        char log_buff[128] = {0};
        struct sockaddr_in sin;
        socklen_t len = sizeof(struct sockaddr_in);
        int accept_fd = 0;

        //accept lock
        pthread_mutex_lock(&g_search_port_lock);
        accept_fd = accept(fd, (struct sockaddr*)&sin, &len);
        pthread_mutex_unlock(&g_search_port_lock);

        if (accept_fd > 0)
        {
                int iret = 0;
                if((iret = fcntl(accept_fd, F_SETFL, O_NONBLOCK)) < 0)
                {
                        snprintf(log_buff,sizeof(log_buff),"%s fd=%d: fcntl nonblocking error:%d", __func__, accept_fd, iret);
                        g_log.write_record(log_buff);
                        return;
                }

                struct interface_data *p_read_it = it_pool_get();
                // add a read event for receive data
                p_read_it->sd = accept_fd;
                gettimeofday(&p_read_it->l_time[0],0);
                reg_add_event(&(p_read_it->ev),accept_fd,EV_READ,RecvData,p_read_it,p_base,&tv_recv_timeout);
                snprintf(log_buff,sizeof(log_buff),"Thread[%x] process thread read new client fd[%d]", (int)pthread_self(), accept_fd);
                g_log.write_record(log_buff);

        }
        else
        {
//              snprintf(log_buff,sizeof(log_buff),"%s[%d]\t%s:accept  error return:%d, errno:%d", __FILE__,__LINE__,__func__,accept_fd,errno);
//              g_log.write_record(log_buff);

        }

}

 

posted @ 2017-07-25 18:48  dodng  阅读(212)  评论(0)    收藏  举报