int main(int argc,char* argv[]) { if(argc != 3 ) { usage(argv[0]); exit(1); } int port = atoi(argv[2]); int listen_sock = start(argv[1],port); if(listen_sock < 0) exit(2); select_fd_t select_set; init_select_set(&select_set,listen_sock); fd_set r_set;//read file fd set while(1) { FD_ZERO(&r_set); add_read_fd(&r_set,&select_set); //将参数2 的值添加到参数1中 struct timeval timeout ={3,500};//fei zuse switch (select(select_set.max_fd+1,&r_set,NULL,NULL,&timeout) ) { case 0: perror("timeout"); break; case -1: perror("select"); break; default://success { int i = 0; for(;i<_FD_NUM_;++i) { int fd = select_set.fd_arr[i]; if(0==i && FD_ISSET(fd,&r_set) )//new connect { struct sockaddr_in client; socklen_t len = sizeof(client); int new_fd = accept(fd,(struct sockaddr_in*)&client,&len); if(new_fd == -1) { perror("accept"); continue;//失败,继续下次循环 } if ( 0 == add_new_fd(&select_set,new_fd) )//add yes { //do nothing } else//add failed,array is full { close(fd); //资源不足,暂时请求失败 } continue; } //不是监听sock if( fd != _FD_DEFAULT_VAL_ && FD_ISSET(fd,&r_set) ) {//read 就绪 if( 0 == read_data_show(fd) ) { delete_new_fd(&select_set,fd); close(fd); } else { //do nothing } } } } break; } } return 0; }
void *workerFn(void *param) { while (1) { struct epoll_event events[EVENT_LEN]; int n = epoll_wait(epollfd, events, EVENT_LEN, 10000); if (n < 0) { if (errno == EINTR) { continue; } perror("epoll_wait error"); exit(1); } int i; int reenable = 1; for (i = 0; i < n; ++i) { if (events[i].data.fd == listenfd) { int fd = accept(listenfd, NULL, NULL); if (fd > 0) { add_new_fd(fd); } else { perror("accept error"); exit(1); } } else { char buf[1024]; while (1) { ssize_t n = recv(events[i].data.fd, buf, sizeof(buf), MSG_DONTWAIT); if (n == 0) { reenable = 0; close_fd(events[i].data.fd); break; } else if (n < 0) { if (errno == EINTR) { continue; } else if (errno == EAGAIN) { break; } else { reenable = 0; close_fd(events[i].data.fd); break; } } else { __sync_fetch_and_add(&packets, 1); int pos = 0; while (pos < n) { int sent = send(events[i].data.fd, buf+pos, n-pos, 0); if (sent <= 0) { break; } pos += sent; } if (pos < n) { reenable = 0; close_fd(events[i].data.fd); } } if (n < sizeof(buf)) { break; } } } if (reenable) { reenable_fd(events[i].data.fd); } } } }