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