Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/epoll.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <arpa/inet.h>
- #include <sys/signalfd.h>
- #include <ctype.h>
- const char HOST[] = "127.0.0.1";
- const size_t MAXSIZE = 4096;
- int main(int argc, char* argv[]) {
- int sockfd = socket(AF_INET, SOCK_STREAM, 0);
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, SIGTERM);
- int epoll_fd = epoll_create1(0);
- int sigfd = signalfd(-1, &set, O_NONBLOCK);
- int flags = fcntl(sigfd, F_GETFL);
- fcntl(sigfd, F_SETFL, flags | O_NONBLOCK);
- struct epoll_event sig_event = {.data.fd = sigfd, .events = EPOLLIN};
- epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sigfd, &sig_event);
- u_int16_t port = strtol(argv[1], NULL, 10);
- struct sockaddr_in addr = {.sin_family = AF_INET, .sin_port = htons(port)};
- inet_aton(HOST, &addr.sin_addr);
- bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
- listen(sockfd, SOMAXCONN);
- struct epoll_event sock_event = {.data.fd = sockfd, .events = EPOLLIN};
- flags = fcntl(sockfd, F_GETFL);
- fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
- epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &sock_event);
- struct epoll_event events[MAXSIZE];
- int open_fds[MAXSIZE];
- size_t open_fds_size = 0;
- while (1) {
- int event_num = epoll_wait(epoll_fd, events, MAXSIZE, -1);
- for (size_t i = 0; i < event_num; ++i) {
- if (events[i].data.fd == sigfd) {
- for (size_t j = 0; j < open_fds_size; ++j) {
- shutdown(open_fds[j], SHUT_RDWR);
- close(open_fds[j]);
- }
- close(sockfd);
- close(epoll_fd);
- _exit(0);
- }
- }
- for (size_t i = 0; i < event_num; ++i) {
- if (events[i].data.fd == sockfd) {
- int confd = accept(sockfd, NULL, NULL);
- struct epoll_event fd_event = {.events = EPOLLIN, .data.fd = confd};
- flags = fcntl(confd, F_GETFL);
- fcntl(confd, F_SETFL, flags | O_NONBLOCK);
- epoll_ctl(epoll_fd, EPOLL_CTL_ADD, confd, &fd_event);
- open_fds[open_fds_size] = confd;
- open_fds_size += 1;
- } else {
- int sz = 0;
- char buffer[MAXSIZE];
- while (1) {
- sz = read(events[i].data.fd, buffer, sizeof(buffer));
- if (sz == -1) {
- break;
- }
- if (sz == 0) {
- size_t it = 0;
- for (; it < open_fds_size; ++it) {
- if (open_fds[it] == events[i].data.fd) {
- break;
- }
- }
- close(open_fds[it]);
- for (size_t j = it + 1; j < open_fds_size; ++j) {
- open_fds[j - 1] = open_fds[j];
- }
- open_fds_size -= 1;
- break;
- }
- char buffer_write[MAXSIZE];
- for (size_t j = 0; j < sz; ++j) {
- buffer_write[j] = toupper(buffer[j]);
- }
- write(events[i].data.fd, buffer_write, sz);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement