Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _GNU_SOURCE
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netinet/tcp.h>
- #define READ_BUFFER (64 * 1024)
- #define RESPONSE "HTTP/1.1 200 Ok\r\nContent-Length: 11\r\n\r\nHello World"
- int find_clrf(const char* buffer, int len) {
- const char* start_buffer = buffer;
- for (; len >= sizeof(int); len--, buffer++)
- if (*((int*)buffer) == *(int*)"\r\n\r\n")
- return buffer - start_buffer;
- return -1;
- }
- void* connection(void* arg) {
- char buffer[READ_BUFFER];
- int bytes, offset = 0, fd = (int)(size_t)arg;
- while ((bytes = read(fd, buffer + offset, READ_BUFFER - offset)) > 0) {
- int consumed = 0, clrf_offset = 0;
- while ((clrf_offset = find_clrf(buffer + clrf_offset + offset, bytes)) != -1) {
- if (send(fd, RESPONSE, sizeof(RESPONSE) - 1, MSG_NOSIGNAL) == -1) {
- close(fd);
- return NULL;
- }
- consumed += clrf_offset;
- }
- if (consumed) memcpy(buffer, buffer + consumed, consumed);
- offset = consumed;
- }
- close(fd);
- }
- int main() {
- int opt = 1, server = socket(AF_INET, SOCK_STREAM, 0);
- if (server < 0) perror("socket create");
- if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) perror("reuse addr");
- struct sockaddr_in addr;
- addr.sin_family = AF_INET;
- addr.sin_port = htons(12345);
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind(server, (struct sockaddr*)&addr, sizeof(addr)) < 0) perror("bind");
- if (listen(server, SOMAXCONN) < 0) perror("listen");
- int client;
- pthread_t thread;
- while ((client = accept(server, NULL, NULL)) > 0) {
- opt = 1;
- if (setsockopt(client, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) < 0) perror("no delay");
- if (pthread_create(&thread, NULL, connection, (void*)(size_t)client) != 0) perror("thread create");
- }
- }
Add Comment
Please, Sign In to add comment