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); }
 
  |