Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/socket.h>
- #include <sys/epoll.h>
- #include <netinet/ip.h>
- #define MAX_EVENTS 10
- int set_async(int fd)
- {
- /* On get les options du fd */
- int flag = fcntl(fd, F_GETFL, 0);
- if(flag < 0){
- return -1;
- } else {
- /* On rajoute l'option asynchrone */
- flag |= O_NONBLOCK;
- }
- /* On met les changements */
- if(fcntl(fd, F_SETFL, flag) < 0)
- return -1;
- return 0;
- }
- int main(int argc, char **argv)
- {
- int sock, clt;
- struct epoll_event ev, events[10];
- int epollfd, tmp;
- /* Création du socket */
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if(sock < 0){
- perror("socket");
- exit(EXIT_FAILURE);
- }
- tmp = 1;
- /* On passe le socket en mode réutilisable avec le booléen tmp */
- if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&tmp, sizeof(tmp)) < 0){
- perror("setsockopt");
- exit(EXIT_FAILURE);
- }
- /* On passe le socket en mode asynchrone */
- if(set_async(sock) < 0){
- perror("get_async");
- exit(EXIT_FAILURE);
- }
- {
- struct sockaddr_in addr;
- addr.sin_family = AF_INET;
- addr.sin_port = htons(8888);
- addr.sin_addr.s_addr = INADDR_ANY;
- /* Bind ... */
- if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
- perror("bind");
- exit(EXIT_FAILURE);
- }
- }
- if(listen(sock, 5) < 0){
- perror("listen");
- exit(EXIT_FAILURE);
- }
- /* Création de l'instance epoll */
- epollfd = epoll_create(MAX_EVENTS);
- if(epollfd < 0){
- perror("epoll_create");
- exit(EXIT_FAILURE);
- }
- ev.events = EPOLLIN; /* read mode */
- ev.data.fd = sock;
- /* Ajout du fd du server au epoll */
- if(epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev) < 0){
- perror("epoll_ctl");
- exit(EXIT_FAILURE);
- }
- {
- struct sockaddr addr; /* Pour get les infos du clients */
- socklen_t addrlen;
- int i;
- char buffer[1024];
- while(1){
- /* Attente d'événements sans timeout */
- tmp = epoll_wait(epollfd, events, 1, -1);
- if(tmp < 0){
- perror("epoll_wait");
- exit(EXIT_FAILURE);
- }
- for(i=0; i < tmp; ++i){
- /* Si le fd est celui du socket server => bloquant */
- if(events[i].data.fd == sock){
- /* => nouvelle connection */
- clt = accept(sock, &addr, &addrlen);
- if(clt < 0){
- perror("accept");
- return -1;
- }
- printf("[+] New client connected\n");
- /* mode asynchrone */
- if(set_async(clt) < 0){
- perror("get_async");
- exit(EXIT_FAILURE);
- }
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = clt;
- /* Ajout du nouveau fd dans l'epoll */
- if(epoll_ctl(epollfd, EPOLL_CTL_ADD, clt, &ev) < 0){
- perror("epoll_ctl");
- exit(EXIT_FAILURE);
- }
- printf("[+] Client add in epoll event\n");
- } else {
- printf("[+]Incomming ...\n");
- memset(buffer, 0, 1024);
- i = recv(events[i].data.fd, buffer, 1024, 0);
- if(i <= 0){ /* Si connection perdue */
- ev.data.fd = events[i].data.fd;
- /* On enleve le fd du epoll */
- if(epoll_ctl(epollfd, EPOLL_CTL_DEL, events[i].data.fd, &ev) < 0){
- perror("epoll_ctl");
- exit(EXIT_FAILURE);
- }
- /* On close le socket */
- close(events[i].data.fd);
- printf("[+] Connection lost\n");
- } else
- printf("%s\n", buffer);
- }
- }
- }
- }
- close(sock);
- close(epollfd);
- exit(EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement