1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <me.h>
#define BUF_SIZE 4 #define EPOLL_SIZE 50
void setnonblockingmode(int );
int main(int argc,char *argv[]) { int serv_sock,clnt_sock; struct sockaddr_in serv_adr,clnt_adr; socklen_t adr_sz; int str_len,i; char buf[BUF_SIZE];
struct epoll_event *ep_events,event; int epfd,event_cnt; if (argc != 2) { printf("Usage : %s <port>\n",argv[0]); exit(1); }
serv_sock = socket(AF_INET,SOCK_STREAM,0); memset(&serv_adr,0,sizeof(serv_adr)); serv_adr.sin_family = AF_INET; serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); serv_adr.sin_port = htons(atoi(argv[1])); if (bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))) error_handle("bind() error")
if (listen(serv_sock,5) == -1) error_handle("listen() error")
epfd = epoll_create(EPOLL_SIZE); ep_events = malloc(EPOLL_SIZE * sizeof(struct epoll_event));
setnonblockingmode(serv_sock); event.events = EPOLLIN | EPOLLET; event.data.fd = serv_sock; epoll_ctl(epfd,EPOLL_CTL_ADD,serv_sock,&event);
while(1) { event_cnt = epoll_wait(epfd,ep_events,EPOLL_SIZE,-1); if (event_cnt == -1) { puts("epoll_wait() error"); break; }
puts("return epoll_wait"); for (i=0; i<event_cnt; i++) { if (serv_sock == ep_events[i].data.fd) { adr_sz = sizeof(clnt_adr); clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_adr,&adr_sz); setnonblockingmode(clnt_sock); event.events = EPOLLIN | EPOLLET; event.data.fd = clnt_sock; epoll_ctl(epfd,EPOLL_CTL_ADD,clnt_sock,&event); printf("connected client: %d \n",clnt_sock); } else { while(1) { str_len = read(ep_events[i].data.fd,buf,BUF_SIZE); if (str_len == 0) { epoll_ctl(epfd,EPOLL_CTL_DEL,ep_events[i].data.fd,NULL); close(ep_events[i].data.fd); printf("closed client: %d \n",ep_events[i].data.fd); break; } else if (str_len < 0) { if (errno == EAGAIN) break; } else { write(ep_events[i].data.fd,buf,str_len); } } } } } close(epfd); close(serv_sock); return 0; }
void setnonblockingmode(int fd) { int flags = fcntl(fd,F_GETFL,0); fcntl(fd,F_SETFL,flags | O_NONBLOCK); }
|