2011-11-18 17 views
12

¿Hay alguna manera de hacer ping a una dirección IP específica con C? Si quisiera hacer ping a "www.google.com" con un cierto número de ping, o para el caso, una dirección local, necesitaría un programa para hacerlo. ¿Cómo puedo hacer ping desde C?¿Hay alguna forma de hacer ping a una dirección IP específica con C?

+0

Utilice la API 'socket' (' man socket'). –

+0

¿Por qué le gustaría hacer ping a Google, suponiendo que no trabaje para Google? – dbasnett

+0

Es un sistema operativo específico. Y 'www.google.com' no es una dirección IP (pero' 192.168.2.34' es uno). –

Respuesta

3

Tendría que aprender sockets, resolver el host al que desea hacer ping, enviar los paquetes ICMP apropiados y escuchar una respuesta. No hay una función ping en la biblioteca estándar. Sin embargo, hay muchas bibliotecas de red de nivel superior que ya implementan el protocolo.

9

Se podría crear su propia ICMP packets usando raw sockets, pero que está lejos de ser trivial. El source code for ping(1) es un buen lugar para comenzar a descubrir cómo hacerlo (utiliza una licencia similar a BSD, vea el código fuente de la licencia completa). Tenga en cuenta que los sockets sin formato requieren privilegios de root en Linux, por lo que su programa necesitará ser root setuid.

Por supuesto, es mucho más fácil pagar el ejecutable ping(1) y no tener que lidiar con nada de esto usted mismo. No tendrá que preocuparse por la licencia del código, y su programa no necesitará privilegios de root (suponiendo que ya no los necesite para otra cosa). system(3), popen(3) y fork(3)/exec(3) son tus amigos.

+0

Deseo que haya dado una mejor explicación del método de sistema/ejecución. Esto hubiera sido extremadamente útil. – CaptainBli

10

Todavía no hay una respuesta aceptada y me encontré con esta pregunta al tratar de hacer exactamente lo que se solicitó aquí, así que quería referirme a Aif's respuesta here.
El siguiente código se basa en su ejemplo y hace ping en el DNS público de Google en un proceso hijo e imprime el resultado en el proceso principal.

#include <sys/wait.h> 
#include <unistd.h> 
#include <stdio.h> 

#define BUFLEN 1024 

int main(int argc, char **argv) 
{ 
    int pipe_arr[2]; 
    char buf[BUFLEN]; 

    //Create pipe - pipe_arr[0] is "reading end", pipe_arr[1] is "writing end" 
    pipe(pipe_arr); 

    if(fork() == 0) //child 
    { 
     dup2(pipe_arr[1], STDOUT_FILENO); 
     execl("/sbin/ping", "ping", "-c 1", "8.8.8.8", (char*)NULL);  
    } 
    else //parent 
    { 
     wait(NULL); 
     read(pipe_arr[0], buf, BUFLEN); 
     printf("%s\n", buf); 

    } 

    close(pipe_arr[0]); 
    close(pipe_arr[1]); 
    return 0; 
} 
Cuestiones relacionadas