#include #include #include #include #include #include #include #include static char* host = NULL; static int size = 56; static int pings_per_burst = 10; static int bursts = 0; // 0 = бесконечно static double interval = 1.0; void usage() { printf("Использование: burstping [-s размер] [-p посылок] [-b пачек] [-i интервал] host\n\n"); printf(" -s размер Размер данных в ICMP-пакете (по умолчанию 56)\n"); printf(" -p посылок Количество пингов в одной пачке (по умолчанию 10)\n"); printf(" -b пачек Количество пачек (0 = бесконечно, по умолчанию 0)\n"); printf(" -i интервал Интервал между пачками в секундах (можно 0.3, 0.05 и т.д., по умолчанию 1.0)\n\n"); printf("Примеры:\n"); printf(" burstping 8.8.8.8\n"); printf(" burstping -s 1472 -p 100 -i 0.2 1.1.1.1\n"); printf(" burstping -p 50 -b 30 -i 1 google.com\n"); printf(" burstping -p 200 -i 0.05 -b 0 10.0.0.1 # бесконечный burst\n"); exit(1); } void sigint_handler(int sig) { printf("\n\n⛔ burstping остановлен по Ctrl+C\n"); exit(0); } int main(int argc, char** argv) { int opt; while ((opt = getopt(argc, argv, "s:p:b:i:h")) != -1) { switch (opt) { case 's': size = atoi(optarg); break; case 'p': pings_per_burst = atoi(optarg); break; case 'b': bursts = atoi(optarg); break; case 'i': interval = strtod(optarg, NULL); break; case 'h': case '?': usage(); } } if (optind >= argc) usage(); host = argv[optind]; if (size < 0 || pings_per_burst < 1) usage(); signal(SIGINT, sigint_handler); printf("🚀 burstping → %s\n", host); printf("Пакет: %d байт | Посылок в пачке: %d | Пачек: %s | Интервал: %.3f сек\n\n", size, pings_per_burst, (bursts == 0 ? "∞" : "ограничено"), interval); int burst_num = 0; while (1) { burst_num++; printf("=== Пачка #%d ===\n", burst_num); // Запускаем пачку параллельно int launched = 0; for (int i = 0; i < pings_per_burst; i++) { pid_t pid = fork(); if (pid == 0) { // Дочерний процесс char sz[16], cnt[4]; snprintf(sz, sizeof(sz), "%d", size); snprintf(cnt, sizeof(cnt), "1"); execlp("ping", "ping", "-c", cnt, "-s", sz, "-W", "2", "-n", host, (char*)NULL); perror("execlp ping"); exit(1); } else if (pid > 0) { launched++; } else { perror("fork"); } } // Ждём завершения всех пингов этой пачки for (int i = 0; i < launched; i++) { wait(NULL); } if (bursts > 0 && burst_num >= bursts) { break; } // Интервал между пачками if (interval > 0.0) { struct timespec ts; ts.tv_sec = (time_t)interval; ts.tv_nsec = (long)((interval - ts.tv_sec) * 1e9); nanosleep(&ts, NULL); } } printf("✅ burstping завершён.\n"); return 0; }