Salida de comando ping

Hola. Estoy haciendo un programa que testee host y redes. Para ello utilizo el comando ping haciendo una llamada system, en C++. ¿Alguien conoce la salida del comando ping? ¿Que valor arroja?

Saludos.
 
Esto es lo que te devuelve:

1- Cuando conecta:

consola dijo:
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=13 time=0.153 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=13 time=0.150 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=13 time=0.150 ms
^C
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2017ms
rtt min/avg/max/mdev = 0.150/0.151/0.153/0.001 ms
2- Cuando no conecta:

PING 192.168.1.160 (192.168.1.160) 56(84) bytes of data.
From 192.168.1.101 icmp_seq=1 Destination Host Unreachable
From 192.168.1.101 icmp_seq=2 Destination Host Unreachable
From 192.168.1.101 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.1.160 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3049ms
Tal vez te conviene usar sockets a puertos preestablecidos para saber si del otro lado hay respuesta o no.
 
Última edición:
Es un programa en C++ con el framework Qt el que estoy realizando, con una interfaz gráfica. Lo que he hecho es:

Código:
 do
    {
        cadena=stream->readLine();
        if(cadena.isNull())
        {
            break;
        }
        i=cadena.lastIndexOf(".");
        ip=cadena.left(i+1);
        ip.append("1");
        ip_8bit="ping "+ ip.toUtf8();
        estado=system(ip_8bit);
        if(estado==0)
        {
         *(streamUp)<<cadena<<"\r\n";
        }
        if(estado!=0)
        {
         *(streamDown)<<cadena<<"\r\n";
        }

        streamDown->flush();
        streamUp->flush();
    }while(!cadena.isNull());
Por lo que he visto si la salida de system("ping ip") es 0 hubo respuesta y si la salida de system("ping ip") no es cero no ha habido respuesta. ¿Es así? he probado varias ip y ese es el resultado que he obtenido.

¿Será que la salida es 0% packet lost? pero lo que si hay echo que no tienen respuesta y otros sí y aún así la salida es cero. Salvo que los 4 echos no tengan respuesta y ahí si es distinto de cero.
 
Si en consola ejecutás:

"man ping"

Te abre el manual de como se usa el ping y su descripción. Lo más destacado que te interesa es:

manual - ping dijo:
If ping does not receive any reply packets at all it will exit with code 1. If a packet count and
deadline are both specified, and fewer than count packets are received by the time the deadline has
arrived, it will also exit with code 1. On other error it exits with code 2. Otherwise it exits with
code 0
. This makes it possible to use the exit code to see if a host is alive or not.
Cuando devuelve 0 es que hubo respuesta, con 1 es que no hubo respuesta y con 2 es que hubo algún problema, tal como dijiste vos.
 

shevchenko

Well-known-Ruso
Para probar podes poner "ping google.com.ar -t -l 2 (corresponden a la cantidad de veces que defeas tirar pin y al tamaño del paquete)

Saludos!
 

Dr. Zoidberg

Well-known-Papá Pitufo
En que sistema operativo estás trabajando???? Por que no hace falta hacer un programa en C++ para verificar si uno o mas hosts están operativos. Bajo Windossssss podés hacer un script de DOS y correrlo en background como tarea programada.

Te paso lo que yo hice, y podés usarlo de base para Linux...

Archivo --> verifica.cmd
(este es el que hay que ejecutar... y se encarga de llamar a los otros)
Código:
@rem El que atiende los servidores
@set encargado=encargado@tu.dominio.de.correo

@rem El tiempo de repetición entre verificaciones (en segundos)
@set tiempo=1800

:comienzo
@rem Verificamos los servidores y analizamos los resultados
@call chkservers.cmd %encargado%

@rem Aca se acabo la historia, así que esperamos un rato
@sleep %tiempo%

@rem  ...y hacemos todo de nuevo
@goto comienzo
Archivo --> chkservers.cmd
Código:
@rem en %1 viene la direccion de mail de quien se encarga de atender los servers

@rem Proceso de verificacion
@rem Le mandamos un ping a cada server de la lista [servers.lst] y guardamos la respuesta
@rem en un archivo .txt con el nombre del server pingueado

@for /F "eol=;" %%f in (servers.lst) do @ping -n 1 %%f > %%f.txt

@rem Analizamos cada archivo de respuesta al ping buscando las palabras "bytes=32" en la
@rem tercera linea. Si esta ahí es que el server contesto el ping, si no el pingok le manda un
@rem mail al encargado para que lo arregle.

@for /F "eol=;" %%f in (servers.lst) do @call pingok.cmd %%f %1
Archivo --> pingok.cmd
Código:
@rem En %1 viene el nombre del server a analizar
@rem En %2 viene la direccion de email del encargado de los servers

@for /F "eol=; skip=2 tokens=1,2,3,4*" %%A in (%1.txt) do @if "%%D" == "bytes=32" goto fin
@echo Notificando al sysadmin...
@bmail -s aca.va.tu.servidor.de.correo -h -t %2 -f nombre.del.servicio.de.analisis@tu.dominio.de.correo -a "Fallo del server %1" -b "El servidor %1 esta fuera de linea."
:fin
Archivo --> servers.lst
Código:
;Si comienza con punto y coma, es un comentario
nombre.o.ip.server.1
nombre.o.ip.server.2
nombre.o.ip.server.3
nombre.o.ip.server.etc.etc
Los ejecutables sleep.exe y bmail.exe están disponibles gratuitamente en la web.
Ponés todo junto en un mismo directorio y ejecutás verifica.cmd
 

Temas similares


Arriba