8 changed files with 164 additions and 7 deletions
@ -0,0 +1,103 @@
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <unistd.h> |
||||
#include <sys/wait.h> |
||||
#include <signal.h> |
||||
#include <time.h> |
||||
#include <string.h> |
||||
#include <errno.h> |
||||
|
||||
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; |
||||
} |
||||
Loading…
Reference in new issue