Exemplo n.º 1
0
int main(int argc, char const *argv[])
{
  struct epoll_event ev, events[MAX_EVENTS];
  int listen_sock, conn_sock, nfds, epollfd;
  struct sockaddr_in cliaddr, servaddr;
  int len, n;

  if (argc != 2)
  {
    fprintf(stderr, "usage: srvselect <port>\n");
    exit(1);
  }

  if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  {
    perror("socket error");
    exit(1);
  }

  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(atoi(argv[1]));
  servaddr.sin_addr.s_addr = htons(INADDR_ANY);

  if (bind(listen_sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
  {
    perror("bind error");
    exit(1);
  }

  if (listen(listen_sock, LISTENQ) < 0)
  {
    perror("listen error");
    exit(1);
  }

  epollfd = epoll_create(10);
  if (epollfd == -1) {
      perror("epoll_create");
      exit(EXIT_FAILURE);
  }

  ev.events = EPOLLIN;
  ev.data.fd = listen_sock;
  if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
      perror("epoll_ctl: listen_sock");
      exit(EXIT_FAILURE);
  }

  for (;;) {
     nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
     if (nfds == -1) {
         perror("epoll_pwait");
         exit(EXIT_FAILURE);
     }

     for (n = 0; n < nfds; ++n) {
         if (events[n].data.fd == listen_sock) {
             conn_sock = accept(listen_sock, (struct sockaddr *) &cliaddr, &len);
             if (conn_sock == -1) {
                 perror("accept");
                 exit(EXIT_FAILURE);
             }
             setnonblocking(conn_sock);
             ev.events = EPOLLIN;
             ev.data.fd = conn_sock;
             if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) == -1) {
                 perror("epoll_ctl: conn_sock");
                 exit(EXIT_FAILURE);
             }
         } 
         else {
            do_use_fd(events[n].data.fd);
         }
     }
  }
  return 0;
}
Exemplo n.º 2
0
int main(int argc, char** argv) {
    if(argc != 2) {
        printf("Usage: %s <listen port>\n", argv[0]);
        return 1;
    }
    
    unsigned short port = (unsigned short)atoi(argv[1]);
    int listen_sock = create_listen_socket(port);
    if (listen_sock == -1) {
        return 3;
    }

    int epollfd = epoll_create(MAX_EVENTS);
    if (epollfd == -1) {
        perror("epoll_create");
        return 4;
    }

    struct epoll_event ev, events[MAX_EVENTS];
    ev.events = EPOLLIN;
    ev.data.fd = listen_sock;
    if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
        perror("epoll_ctl: listen_sock");
        return 5;
    }

    int nfds = 0;
    for(;;) {
        nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
        if (nfds == -1) {
            perror("epoll_wait");
            return 6;
        }

        int n;
        for (n= 0; n < nfds; ++n) {
            if(events[n].data.fd == listen_sock) {
                struct sockaddr_in peer_addr;
                int addrlen = sizeof(peer_addr);
                int conn_sock = accept(listen_sock, (struct sockaddr*)&peer_addr, (socklen_t*)&addrlen);
                if(conn_sock == -1) {
                    perror("accept");
                    return 7;
                }

                printf("[accept] addr: %s, port: %hu, fd: %d\n", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port), conn_sock); 
                if(setnonblocking(conn_sock) == 0) {
                    ev.events = EPOLLIN | EPOLLET;
                    ev.data.fd = conn_sock;
                    if(epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) == -1) {
                        perror("epoll_ctl: conn_sock");
                        close(conn_sock);
                    }
                }
            } else {
                if(do_use_fd(events[n].data.fd) == -1) {
                    epoll_ctl(epollfd, EPOLL_CTL_DEL, events[n].data.fd, NULL);
                    close(events[n].data.fd);
                    printf("[close %d]\n", events[n].data.fd);
                }
            }
        }
    }

    return 0;
}