Advertisement
Guest User

Untitled

a guest
Aug 14th, 2019
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.73 KB | None | 0 0
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/epoll.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netinet/tcp.h>
  10.  
  11. #define NUM_EVENTS 64
  12. #define READ_BUFFER (64 * 1024)
  13. #define RESPONSE "HTTP/1.1 200 Ok\r\nContent-Length: 11\r\n\r\nHello World"
  14.  
  15. int find_clrf(const char* buffer, int len) {
  16.     const char* start_buffer = buffer;
  17.     for (; len >= sizeof(int); len--, buffer++)
  18.         if (*((int*)buffer) == *(int*)"\r\n\r\n")
  19.             return buffer - start_buffer;
  20.     return -1;
  21. }
  22.  
  23. int main() {
  24.     int opt = 1, server = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
  25.     if (server < 0) perror("socket create");
  26.     if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) perror("reuse addr");
  27.  
  28.     struct sockaddr_in addr;
  29.     addr.sin_family = AF_INET;
  30.     addr.sin_port = htons(12345);
  31.     addr.sin_addr.s_addr = htonl(INADDR_ANY);
  32.     if (bind(server, (struct sockaddr*)&addr, sizeof(addr)) < 0) perror("bind");
  33.     if (listen(server, SOMAXCONN) < 0) perror("listen");
  34.  
  35.     int efd = epoll_create1(0);
  36.     if (efd < 0) perror("epoll");
  37.     struct epoll_event event;
  38.     event.events = EPOLLIN | EPOLLET;
  39.     event.data.fd = server;
  40.     if (epoll_ctl(efd, EPOLL_CTL_ADD, server, &event) < 0) perror("epoll add server");
  41.  
  42.     char buffer[READ_BUFFER];
  43.     struct epoll_event events[NUM_EVENTS];
  44.     while (1) {
  45.         int n = epoll_wait(efd, events, NUM_EVENTS, -1);
  46.         for (int i = 0; i < n; i++) {
  47.             int fd = events[i].data.fd;
  48.             if (events[i].events & (EPOLLHUP | EPOLLERR)) {
  49.                 close(events[i].data.fd);
  50.             } else if (fd == server) {
  51.                 while ((fd = accept4(server, NULL, NULL, SOCK_NONBLOCK)) > 0) {
  52.                     opt = 1;
  53.                     event.data.fd = fd;
  54.                     event.events = EPOLLIN | EPOLLET;
  55.                     if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) < 0) perror("no delay");
  56.                     if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &event) < 0) perror("epoll add client");
  57.                 }
  58.             } else {
  59.                 int bytes, offset = 0;
  60.                 while ((bytes = read(fd, buffer + offset, READ_BUFFER - offset)) > 0) {
  61.                     int clrf_offset = 0;
  62.                     while ((clrf_offset = find_clrf(buffer + clrf_offset + offset, bytes)) != -1)
  63.                         if (send(fd, RESPONSE, sizeof(RESPONSE) - 1, MSG_NOSIGNAL) == -1)
  64.                             break;
  65.                     offset += bytes;
  66.                 }
  67.                 if (bytes == 0 || (bytes == -1 && errno != EAGAIN))
  68.                     close(fd);
  69.             }
  70.         }
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement