/* main函数 */ int main(int argc, const char *argv[]) { if (argc < 3) { fprintf(stderr, "usage:%s ip_address port_number\n", argv[0]); exit(1); } int sockfd, epollfd, number; sockfd = create_socket(argv[1], atoi(argv[2])); struct epoll_event events[MAX_EPOLL_EVENTS]; /* linux内核2.6.27版的新函数,和epoll_create(int size)一样的功能,并去掉了无用的size参数 */ if ((epollfd = epoll_create1(0)) == -1) err_exit("epoll_create1() error"); /* 以下设置是针对监听的sockfd,当epoll_wait返回时,必定有事件发生, * 所以这里我们忽略罕见的情况外设置阻塞IO没意义,我们设置为非阻塞IO */ /* sockfd:非阻塞的LT模式 */ //addfd_to_epoll(epollfd, sockfd, EPOLL_LT, FD_NONBLOCK); /* sockfd:非阻塞的ET模式 */ addfd_to_epoll(epollfd, sockfd, EPOLL_ET, FD_NONBLOCK); while (1) { number = epoll_wait(epollfd, events, MAX_EPOLL_EVENTS, -1); if (number == -1) err_exit("epoll_wait() error"); else { /* 以下的LT,ET,以及是否阻塞都是是针对accept()函数返回的文件描述符,即函数里面的connfd */ /* connfd:阻塞的LT模式 */ epoll_process(epollfd, events, number, sockfd, EPOLL_LT, FD_BLOCK); /* connfd:非阻塞的LT模式 */ //epoll_process(epollfd, events, number, sockfd, EPOLL_LT, FD_NONBLOCK); /* connfd:阻塞的ET模式 */ //epoll_process(epollfd, events, number, sockfd, EPOLL_ET, FD_BLOCK); /* connfd:非阻塞的ET模式 */ //epoll_process(epollfd, events, number, sockfd, EPOLL_ET, FD_NONBLOCK); } } close(sockfd); return 0; }
void CEpollMode::run() { epoll_process(); }