You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.6 KiB
103 lines
3.6 KiB
#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; |
|
}
|
|
|