Guest User

Untitled

a guest
Aug 14th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.01 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 <pthread.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netinet/tcp.h>
  10.  
  11. #define READ_BUFFER (64 * 1024)
  12. #define RESPONSE "HTTP/1.1 200 Ok\r\nContent-Length: 11\r\n\r\nHello World"
  13.  
  14. int find_clrf(const char* buffer, int len) {
  15.     const char* start_buffer = buffer;
  16.     for (; len >= sizeof(int); len--, buffer++)
  17.         if (*((int*)buffer) == *(int*)"\r\n\r\n")
  18.             return buffer - start_buffer;
  19.     return -1;
  20. }
  21.  
  22. void* connection(void* arg) {
  23.     char buffer[READ_BUFFER];
  24.     int bytes, offset = 0, fd = (int)(size_t)arg;
  25.     while ((bytes = read(fd, buffer + offset, READ_BUFFER - offset)) > 0) {
  26.         int consumed = 0, clrf_offset = 0;
  27.         while ((clrf_offset = find_clrf(buffer + clrf_offset + offset, bytes)) != -1) {
  28.             if (send(fd, RESPONSE, sizeof(RESPONSE) - 1, MSG_NOSIGNAL) == -1) {
  29.                 close(fd);
  30.                 return NULL;
  31.             }
  32.             consumed += clrf_offset;
  33.         }
  34.         if (consumed) memcpy(buffer, buffer + consumed, consumed);
  35.         offset = consumed;
  36.     }
  37.     close(fd);
  38. }
  39.  
  40. int main() {
  41.     int opt = 1, server = socket(AF_INET, SOCK_STREAM, 0);
  42.     if (server < 0) perror("socket create");
  43.     if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) perror("reuse addr");
  44.  
  45.     struct sockaddr_in addr;
  46.     addr.sin_family = AF_INET;
  47.     addr.sin_port = htons(12345);
  48.     addr.sin_addr.s_addr = htonl(INADDR_ANY);
  49.     if (bind(server, (struct sockaddr*)&addr, sizeof(addr)) < 0) perror("bind");
  50.     if (listen(server, SOMAXCONN) < 0) perror("listen");
  51.  
  52.     int client;
  53.     pthread_t thread;
  54.     while ((client = accept(server, NULL, NULL)) > 0) {
  55.         opt = 1;
  56.         if (setsockopt(client, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) < 0) perror("no delay");
  57.         if (pthread_create(&thread, NULL, connection, (void*)(size_t)client) != 0) perror("thread create");
  58.     }
  59. }
Add Comment
Please, Sign In to add comment