示例#1
0
void loop_epoll(server_t *server)
{
    int epollfd = epoll_create1(0);
    if (epollfd == -1) err_exit("epoll_create1");

    add_to_epoll(epollfd, server->listen_fd);

    struct epoll_event *events = calloc(LOOP_EPOLL_MAXEVENTS, sizeof(struct epoll_event));

    while (!server->quit) {
        int n = epoll_wait(epollfd, events, LOOP_EPOLL_MAXEVENTS, -1);
        int i;
        for (i = 0; i < n; i++) {
            if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) {
                err_message("epoll error, closing %d\n", events[i].data.fd);
                close(events[i].data.fd);
                continue;
            }
            else if (server->listen_fd == events[i].data.fd) { /* incoming connections. */
                struct sockaddr addr;
                socklen_t in_len = sizeof addr;
                int newfd = accept(server->listen_fd, &addr, &in_len);
                printf("Accepted connection on descriptor %d ", newfd);
                add_to_epoll(epollfd, newfd);
            }
            else { /* incoming data */
                command_t command = get_next_command(events[i].data.fd);
                process_command(server, &command);
            }
        }
    }

    free(events);
    close(server->listen_fd);
}
示例#2
0
int create_timer(int interval_value , int epoll_fd)
{
    int timer_fd = timerfd_create(CLOCK_REALTIME , 0);
    if(timer_fd < 0) 
    {
        LOG_ERROR("In create_timer : timerfd_create error : %s" , STR_ERROR);
        return -1;
    }
    struct timespec interval;
    interval.tv_sec = interval_value;
    interval.tv_nsec = 0;

    struct itimerspec spec;
    spec.it_value = interval;
    spec.it_interval = interval;

    if(timerfd_settime(timer_fd , TFD_TIMER_ABSTIME , &spec , NULL) < 0)
    {
        LOG_ERROR("In create_timer : timerfd_settime error : %s" , STR_ERROR);
        close(timer_fd);
        return -1;
    }

    if(add_to_epoll(epoll_fd , timer_fd , EPOLLIN , NULL) < 0)
    {
        LOG_ERROR("In create_timer : all timer %d to epoll error !" , timer_fd);
        close(timer_fd);
        return -1;
    }

    return timer_fd;
}