#include #include #include #include #include #include #include #include #define MAX_EVENTS 1024 #define TIMEOUT 250 #define PORT 80 int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return EXIT_FAILURE; } struct sockaddr_in addr; struct epoll_event ev, events[MAX_EVENTS]; int epoll_fd = epoll_create1(0); if (epoll_fd == -1) { perror("epoll_create1"); return EXIT_FAILURE; } for (int i = 1; i < 255; i++) { char ip[16]; snprintf(ip, sizeof(ip), "%s.%d", argv[1], i); int sock = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0); if (sock < 0) { perror("socket"); continue; // Skip to next } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); inet_pton(AF_INET, ip, &addr.sin_addr); if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { if (errno != EINPROGRESS) { perror("connect"); close(sock); continue; // Skip to next } } ev.data.fd = sock; ev.events = EPOLLERR | EPOLLHUP | EPOLLOUT; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock, &ev) == -1) { perror("epoll_ctl"); close(sock); continue; // Skip to next } // printf("Trying to connect to %s...\n", ip); } while (1) { // TODO: Timout nicht bei jedem Poll von vorne beginnen lassen int n = epoll_wait(epoll_fd, events, MAX_EVENTS, TIMEOUT); if (n < 0) { perror("epoll_wait"); break; } for (int i = 0; i < n; i++) { if (events[i].events & EPOLLOUT) { char ip[16]; if (getpeername(events[i].data.fd, (struct sockaddr *)&addr, (socklen_t *)&(socklen_t){sizeof(addr)}) == 0) { inet_ntop(AF_INET, &addr.sin_addr, ip, sizeof(ip)); printf("Successful connection to %s\n", ip); } close(events[i].data.fd); } else { perror("Error in epoll event"); close(events[i].data.fd); } } if (n == 0) { printf("Timeout reached. Stopping.\n"); break; } } close(epoll_fd); return EXIT_SUCCESS; }