Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.47 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <unistd.h>
  3. #include <sys/epoll.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <stdlib.h>
  7. #include <signal.h>
  8. #include <arpa/inet.h>
  9. #include <sys/signalfd.h>
  10. #include <ctype.h>
  11.  
  12. const char HOST[] = "127.0.0.1";
  13. const size_t MAXSIZE = 4096;
  14.  
  15. int main(int argc, char* argv[]) {
  16.     int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  17.     sigset_t set;
  18.     sigemptyset(&set);
  19.     sigaddset(&set, SIGTERM);
  20.  
  21.     int epoll_fd = epoll_create1(0);
  22.     int sigfd = signalfd(-1, &set, O_NONBLOCK);
  23.     int flags = fcntl(sigfd, F_GETFL);
  24.     fcntl(sigfd, F_SETFL, flags | O_NONBLOCK);
  25.  
  26.     struct epoll_event sig_event = {.data.fd = sigfd, .events = EPOLLIN};
  27.     epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sigfd, &sig_event);
  28.  
  29.     u_int16_t port = strtol(argv[1], NULL, 10);
  30.     struct sockaddr_in addr = {.sin_family = AF_INET, .sin_port = htons(port)};
  31.     inet_aton(HOST, &addr.sin_addr);
  32.     bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
  33.     listen(sockfd, SOMAXCONN);
  34.  
  35.     struct epoll_event sock_event = {.data.fd = sockfd, .events = EPOLLIN};
  36.  
  37.     flags = fcntl(sockfd, F_GETFL);
  38.     fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
  39.  
  40.     epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &sock_event);
  41.  
  42.     struct epoll_event events[MAXSIZE];
  43.     int open_fds[MAXSIZE];
  44.     size_t open_fds_size = 0;
  45.  
  46.     while (1) {
  47.         int event_num = epoll_wait(epoll_fd, events, MAXSIZE, -1);
  48.         for (size_t i = 0; i < event_num; ++i) {
  49.             if (events[i].data.fd == sigfd) {
  50.                 for (size_t j = 0; j < open_fds_size; ++j) {
  51.                     shutdown(open_fds[j], SHUT_RDWR);
  52.                     close(open_fds[j]);
  53.                 }
  54.                 close(sockfd);
  55.                 close(epoll_fd);
  56.                 _exit(0);
  57.             }
  58.         }
  59.         for (size_t i = 0; i < event_num; ++i) {
  60.             if (events[i].data.fd == sockfd) {
  61.                 int confd = accept(sockfd, NULL, NULL);
  62.                 struct epoll_event fd_event = {.events = EPOLLIN, .data.fd = confd};
  63.                 flags = fcntl(confd, F_GETFL);
  64.                 fcntl(confd, F_SETFL, flags | O_NONBLOCK);
  65.                 epoll_ctl(epoll_fd, EPOLL_CTL_ADD, confd, &fd_event);
  66.                 open_fds[open_fds_size] = confd;
  67.                 open_fds_size += 1;
  68.             } else {
  69.                 int sz = 0;
  70.                 char buffer[MAXSIZE];
  71.                 while (1) {
  72.                     sz = read(events[i].data.fd, buffer, sizeof(buffer));
  73.                     if (sz == -1) {
  74.                         break;
  75.                     }
  76.                     if (sz == 0) {
  77.                         size_t it = 0;
  78.                         for (; it < open_fds_size; ++it) {
  79.                             if (open_fds[it] == events[i].data.fd) {
  80.                                 break;
  81.                             }
  82.                         }
  83.                         close(open_fds[it]);
  84.                         for (size_t j = it + 1; j < open_fds_size; ++j) {
  85.                             open_fds[j - 1] = open_fds[j];
  86.                         }
  87.                         open_fds_size -= 1;
  88.                         break;
  89.                     }
  90.                     char buffer_write[MAXSIZE];
  91.                     for (size_t j = 0; j < sz; ++j) {
  92.                         buffer_write[j] = toupper(buffer[j]);
  93.                     }
  94.                     write(events[i].data.fd, buffer_write, sz);
  95.                 }
  96.             }
  97.         }
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement