Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <fcntl.h>
  7. #include <sys/socket.h>
  8. #include <sys/epoll.h>
  9. #include <netinet/ip.h>
  10.  
  11. #define MAX_EVENTS 10
  12.  
  13. int set_async(int fd)
  14. {
  15.   /* On get les options du fd */
  16.   int flag = fcntl(fd, F_GETFL, 0);
  17.   if(flag < 0){
  18.     return -1;
  19.   } else {
  20.     /* On rajoute l'option asynchrone */
  21.     flag |= O_NONBLOCK;
  22.   }
  23.   /* On met les changements */
  24.   if(fcntl(fd, F_SETFL, flag) < 0)
  25.     return -1;
  26.  
  27.   return 0;
  28. }
  29.  
  30. int main(int argc, char **argv)
  31. {
  32.   int sock, clt;
  33.   struct epoll_event ev, events[10];
  34.   int epollfd, tmp;
  35.  
  36.   /* Création du socket */
  37.   sock = socket(AF_INET, SOCK_STREAM, 0);
  38.   if(sock < 0){
  39.     perror("socket");
  40.     exit(EXIT_FAILURE);
  41.   }
  42.  
  43.   tmp = 1;
  44.   /* On passe le socket en mode réutilisable avec le booléen tmp */
  45.   if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&tmp, sizeof(tmp)) < 0){
  46.     perror("setsockopt");
  47.     exit(EXIT_FAILURE);
  48.   }
  49.  
  50.   /* On passe le socket en mode asynchrone */
  51.   if(set_async(sock) < 0){
  52.     perror("get_async");
  53.     exit(EXIT_FAILURE);
  54.   }
  55.  
  56.   {
  57.     struct sockaddr_in addr;
  58.     addr.sin_family = AF_INET;
  59.     addr.sin_port = htons(8888);
  60.     addr.sin_addr.s_addr = INADDR_ANY;
  61.     /* Bind ... */
  62.     if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
  63.       perror("bind");
  64.       exit(EXIT_FAILURE);
  65.     }
  66.   }
  67.  
  68.   if(listen(sock, 5) < 0){
  69.     perror("listen");
  70.     exit(EXIT_FAILURE);
  71.   }
  72.  
  73.   /* Création de l'instance epoll */
  74.   epollfd = epoll_create(MAX_EVENTS);
  75.   if(epollfd < 0){
  76.     perror("epoll_create");
  77.     exit(EXIT_FAILURE);
  78.   }
  79.  
  80.   ev.events = EPOLLIN; /* read mode */
  81.   ev.data.fd = sock;
  82.   /* Ajout du fd du server au epoll */
  83.   if(epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev) < 0){
  84.     perror("epoll_ctl");
  85.     exit(EXIT_FAILURE);
  86.   }
  87.  
  88.   {
  89.     struct sockaddr addr; /* Pour get les infos du clients */
  90.     socklen_t addrlen;
  91.     int i;
  92.     char buffer[1024];
  93.  
  94.     while(1){
  95.       /* Attente d'événements sans timeout */
  96.       tmp = epoll_wait(epollfd, events, 1, -1);
  97.       if(tmp < 0){
  98.     perror("epoll_wait");
  99.     exit(EXIT_FAILURE);
  100.       }
  101.       for(i=0; i < tmp; ++i){
  102.     /* Si le fd est celui du socket server => bloquant */
  103.     if(events[i].data.fd == sock){
  104.       /* => nouvelle connection */
  105.       clt = accept(sock, &addr, &addrlen);
  106.       if(clt < 0){
  107.         perror("accept");
  108.         return -1;
  109.       }
  110.       printf("[+] New client connected\n");
  111.       /* mode asynchrone */
  112.       if(set_async(clt) < 0){
  113.         perror("get_async");
  114.         exit(EXIT_FAILURE);
  115.       }  
  116.       ev.events = EPOLLIN | EPOLLET;
  117.       ev.data.fd = clt;
  118.       /* Ajout du nouveau fd dans l'epoll */
  119.       if(epoll_ctl(epollfd, EPOLL_CTL_ADD, clt, &ev) < 0){
  120.         perror("epoll_ctl");
  121.         exit(EXIT_FAILURE);
  122.       }
  123.       printf("[+] Client add in epoll event\n");
  124.     } else {
  125.       printf("[+]Incomming ...\n");
  126.       memset(buffer, 0, 1024);
  127.       i = recv(events[i].data.fd, buffer, 1024, 0);
  128.       if(i <= 0){ /* Si connection perdue */
  129.         ev.data.fd = events[i].data.fd;
  130.         /* On enleve le fd du epoll */
  131.         if(epoll_ctl(epollfd, EPOLL_CTL_DEL, events[i].data.fd, &ev) < 0){
  132.           perror("epoll_ctl");
  133.           exit(EXIT_FAILURE);
  134.         }      
  135.         /* On close le socket */
  136.         close(events[i].data.fd);
  137.         printf("[+] Connection lost\n");
  138.       } else
  139.         printf("%s\n", buffer);
  140.     }
  141.       }
  142.     }
  143.   }
  144.   close(sock);
  145.   close(epollfd);
  146.   exit(EXIT_SUCCESS);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement