| 69 | } |
| 70 | |
| 71 | void *loop(void *arg) |
| 72 | { |
| 73 | /* Wait for events to happen */ |
| 74 | while (!exit_flag) { |
| 75 | /* |
| 76 | * If not call alarm_event_sem, and epoll_wait timeout is 0, |
| 77 | * it can't exit normal, so timeout can't set to 0. |
| 78 | */ |
| 79 | int nevents = epoll_wait(epfd, events, MAX_EVENTS, -1); |
| 80 | int i; |
| 81 | |
| 82 | if (nevents <= 0) { |
| 83 | if (nevents) { |
| 84 | printf("hello world epoll wait ret %d, errno:%d, %s\n", |
| 85 | nevents, errno, strerror(errno)); |
| 86 | break; |
| 87 | } |
| 88 | usleep(100); |
| 89 | //sleep(1); |
| 90 | } |
| 91 | //printf("get nevents:%d\n", nevents); |
| 92 | |
| 93 | for (i = 0; i < nevents; ++i) { |
| 94 | /* Handle new connect */ |
| 95 | if (events[i].data.fd == sockfd || events[i].data.fd == sockfd_kernel) { |
| 96 | while (1) { |
| 97 | int nclientfd = accept(events[i].data.fd, NULL, NULL); |
| 98 | printf("accept sockfd(_kernel):%d, nclientfd:%d, errono:%d/%s\n", events[i].data.fd, nclientfd, errno, strerror(errno)); |
| 99 | if (nclientfd < 0) { |
| 100 | break; |
| 101 | } |
| 102 | |
| 103 | /* Add to event list */ |
| 104 | ev.data.fd = nclientfd; |
| 105 | ev.events = EPOLLIN; |
| 106 | if (epoll_ctl(epfd, EPOLL_CTL_ADD, nclientfd, &ev) != 0) { |
| 107 | printf("ff_epoll_ctl failed:%d, %s\n", |
| 108 | errno, strerror(errno)); |
| 109 | close(nclientfd); |
| 110 | break; |
| 111 | } |
| 112 | if (events[i].data.fd == sockfd_kernel) { |
| 113 | break; |
| 114 | } |
| 115 | } |
| 116 | } else { |
| 117 | if (events[i].events & EPOLLERR ) { |
| 118 | /* Simply close socket */ |
| 119 | epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL); |
| 120 | close(events[i].data.fd); |
| 121 | } else if (events[i].events & EPOLLIN) { |
| 122 | char buf[256]; |
| 123 | size_t readlen = read( events[i].data.fd, buf, sizeof(buf)); |
| 124 | if(readlen > 0) { |
| 125 | size_t writelen = write( events[i].data.fd, html, sizeof(html) - 1); |
| 126 | if (writelen < 0){ |
| 127 | printf("write failed, readlen:%lu, writelen:%lu, :%d, %s\n", |
| 128 | readlen, writelen, errno, strerror(errno)); |