@ -19,7 +19,8 @@
# define RECV_TIMEOUT_SEC 5
static char * host = NULL ;
static int data_size = 56 ;
static int data_size_min = 56 ;
static int data_size_max = 56 ;
static int pings_per_burst = 10 ;
static int bursts = 0 ; // 0 = бесконечно
static double interval_sec = 1.0 ;
@ -61,9 +62,29 @@ void send_one_ping(int sock, const struct sockaddr_in *to, int datalen, uint16_t
( struct sockaddr * ) to , sizeof ( * to ) ) ;
}
static int parse_size_arg ( const char * arg , int * min_val , int * max_val ) {
const char * colon = strchr ( arg , ' : ' ) ;
if ( colon ) {
char * end ;
long min = strtol ( arg , & end , 10 ) ;
if ( end ! = colon | | min < 0 | | min > MAX_DATA_SIZE ) return - 1 ;
long max = strtol ( colon + 1 , & end , 10 ) ;
if ( * end ! = ' \0 ' | | max < 0 | | max > MAX_DATA_SIZE | | max < min ) return - 1 ;
* min_val = ( int ) min ;
* max_val = ( int ) max ;
} else {
char * end ;
long val = strtol ( arg , & end , 10 ) ;
if ( * end ! = ' \0 ' | | val < 0 | | val > MAX_DATA_SIZE ) return - 1 ;
* min_val = * max_val = ( int ) val ;
}
return 0 ;
}
void usage ( ) {
printf ( " Использование: bping [-s размер] [-p посылок] [-b пачек] [-i интервал] host \n \n " ) ;
printf ( " -s размер данные в байтах (по умолчанию 56, макс ~65k) \n " ) ;
printf ( " формат: -s 1472 (фиксированный) или -s 100:600 (диапазон) \n " ) ;
printf ( " -p посылок пингов в одной пачке (по умолчанию 10, макс 10000) \n " ) ;
printf ( " -b пачек количество пачек (0 = ∞, по умолчанию 0) \n " ) ;
printf ( " -i интервал между пачками в секундах (0.001, 0.05 и т.д., по умолчанию 1.0) \n \n " ) ;
@ -71,7 +92,7 @@ void usage() {
printf ( " Примеры: \n " ) ;
printf ( " sudo bping 8.8.8.8 \n " ) ;
printf ( " bping -s 1472 -p 200 -i 0.05 1.1.1.1 \n " ) ;
printf ( " bping -p 500 -b 0 -i 0.01 192.168.1.1 \n " ) ;
printf ( " bping -s 100:600 -p 50 0 -i 0.01 192.168.1.1 \n " ) ;
exit ( 1 ) ;
}
@ -84,7 +105,12 @@ int main(int argc, char **argv) {
int opt ;
while ( ( opt = getopt ( argc , argv , " s:p:b:i:h " ) ) ! = - 1 ) {
switch ( opt ) {
case ' s ' : data_size = atoi ( optarg ) ; break ;
case ' s ' :
if ( parse_size_arg ( optarg , & data_size_min , & data_size_max ) ! = 0 ) {
fprintf ( stderr , " Ошибка: неверный формат размера. Используйте -s число или -s мин:макс \n " ) ;
usage ( ) ;
}
break ;
case ' p ' : pings_per_burst = atoi ( optarg ) ; break ;
case ' b ' : bursts = atoi ( optarg ) ; break ;
case ' i ' : interval_sec = strtod ( optarg , NULL ) ; break ;
@ -95,7 +121,7 @@ int main(int argc, char **argv) {
if ( optind > = argc ) usage ( ) ;
host = argv [ optind ] ;
if ( data_size < 0 | | data_size > MAX_DATA_SIZE | | pings_per_burst < 1 | | pings_per_burst > MAX_PINGS_PER_BURST ) {
if ( data_size_min < 0 | | data_size_max > MAX_DATA_SIZE | | pings_per_burst < 1 | | pings_per_burst > MAX_PINGS_PER_BURST ) {
usage ( ) ;
}
@ -130,8 +156,13 @@ int main(int argc, char **argv) {
uint16_t global_seq = 0 ;
printf ( " 🚀 bping → %s (raw ICMP) \n " , host ) ;
printf ( " Данные: %d байт | В пачке: %d | Пачек: %s | Интервал: %.3f сек \n \n " ,
data_size , pings_per_burst , ( bursts = = 0 ? " ∞ " : " ограничено " ) , interval_sec ) ;
if ( data_size_min = = data_size_max ) {
printf ( " Данные: %d байт | В пачке: %d | Пачек: %s | Интервал: %.3f сек \n \n " ,
data_size_min , pings_per_burst , ( bursts = = 0 ? " ∞ " : " ограничено " ) , interval_sec ) ;
} else {
printf ( " Данные: %d:%d байт (случайно) | В пачке: %d | Пачек: %s | Интервал: %.3f сек \n \n " ,
data_size_min , data_size_max , pings_per_burst , ( bursts = = 0 ? " ∞ " : " ограничено " ) , interval_sec ) ;
}
// Выделяем память один раз
struct timeval * send_times = malloc ( pings_per_burst * sizeof ( struct timeval ) ) ;
@ -150,10 +181,11 @@ int main(int argc, char **argv) {
// === Отправляем пачку максимально быстро ===
int sent = 0 ;
for ( int i = 0 ; i < pings_per_burst ; i + + ) {
int pkt_size = data_size_min + ( rand ( ) % ( data_size_max - data_size_min + 1 ) ) ;
uint16_t seq = + + global_seq ;
seq_list [ i ] = seq ;
gettimeofday ( & send_times [ i ] , NULL ) ;
send_one_ping ( sock , & dest , data _size, ident , seq ) ;
send_one_ping ( sock , & dest , pkt _size, ident , seq ) ;
sent + + ;
}