#include #include #include #include #include #include #include #include #include #define PORT 50550 #define MAX_EVENTS 64 static int make_nonblocking(int fd) { int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); return fd; } int main(void) { int listen_fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr = { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = htons(PORT) }; bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr)); listen(listen_fd, SOMAXCONN); make_nonblocking(listen_fd); int epfd = epoll_create1(0); struct epoll_event ev = {.events = EPOLLIN, .data.fd = listen_fd}; epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ev); struct epoll_event events[MAX_EVENTS]; printf("Listening on port %d...\n", PORT); for (;;) { int n = epoll_wait(epfd, events, MAX_EVENTS, -1); for (int i = 0; i < n; i++) { int fd = events[i].data.fd; if (fd == listen_fd) { // New connection int client_fd = accept(listen_fd, NULL, NULL); make_nonblocking(client_fd); ev.events = EPOLLIN; ev.data.fd = client_fd; epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &ev); printf("New client %d connected.\n", client_fd); } else if (events[i].events & EPOLLIN) { // Data ready to read char buf[512]; ssize_t len = read(fd, buf, sizeof(buf)); if (len <= 0) { close(fd); printf("Client %d disconnected.\n", fd); } else { write(fd, buf, len); // echo back } } } } }