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