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

#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;
}