Advertisement
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 <sys/epoll.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netinet/tcp.h>
- #define NUM_EVENTS 64
- #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;
- }
- int main() {
- int opt = 1, server = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 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 efd = epoll_create1(0);
- if (efd < 0) perror("epoll");
- struct epoll_event event;
- event.events = EPOLLIN | EPOLLET;
- event.data.fd = server;
- if (epoll_ctl(efd, EPOLL_CTL_ADD, server, &event) < 0) perror("epoll add server");
- char buffer[READ_BUFFER];
- struct epoll_event events[NUM_EVENTS];
- while (1) {
- int n = epoll_wait(efd, events, NUM_EVENTS, -1);
- for (int i = 0; i < n; i++) {
- int fd = events[i].data.fd;
- if (events[i].events & (EPOLLHUP | EPOLLERR)) {
- close(events[i].data.fd);
- } else if (fd == server) {
- while ((fd = accept4(server, NULL, NULL, SOCK_NONBLOCK)) > 0) {
- opt = 1;
- event.data.fd = fd;
- event.events = EPOLLIN | EPOLLET;
- if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) < 0) perror("no delay");
- if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &event) < 0) perror("epoll add client");
- }
- } else {
- int bytes, offset = 0;
- while ((bytes = read(fd, buffer + offset, READ_BUFFER - offset)) > 0) {
- int clrf_offset = 0;
- while ((clrf_offset = find_clrf(buffer + clrf_offset + offset, bytes)) != -1)
- if (send(fd, RESPONSE, sizeof(RESPONSE) - 1, MSG_NOSIGNAL) == -1)
- break;
- offset += bytes;
- }
- if (bytes == 0 || (bytes == -1 && errno != EAGAIN))
- close(fd);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement