2011-11-18 11 views
12

Esiste un modo per eseguire il ping di un indirizzo IP specifico con C? Se volessi eseguire il ping di "www.google.com" con un certo numero di ping, o se fosse per questo, un indirizzo locale, avrei bisogno di un programma per farlo. Come posso eseguire il ping da C?Esiste un modo per eseguire il ping di un indirizzo IP specifico con C?

+0

Utilizzare l'API 'socket' (' man socket'). –

+0

Perché dovresti eseguire il ping su Google, supponendo che non lavori per Google? – dbasnett

+0

È specifico del sistema operativo. E 'www.google.com' non è un indirizzo IP (ma' 192.168.2.34' è uno). –

risposta

3

È necessario apprendere i socket, risolvere l'host che si desidera eseguire il ping, inviare i pacchetti ICMP appropriati e ascoltare una risposta. Non esiste la funzione ping nella libreria standard. Tuttavia, ci sono molte librerie di rete di livello superiore che già implementano il protocollo.

9

Si potrebbe creare il proprio ICMP packets utilizzando raw sockets, ma questo è tutt'altro che banale. Il source code for ping(1) è un buon punto di partenza per capire come farlo (usa una licenza simile a BSD, vedere il codice sorgente per la licenza completa). Tieni presente che i socket raw richiedono i privilegi di root su Linux, quindi il tuo programma dovrà essere impostato come root.

Ovviamente, è molto più semplice eseguire il file eseguibile ping(1) e non dover gestire autonomamente tutto ciò. Non dovrai preoccuparti delle licenze di codice e il tuo programma non avrà bisogno dei privilegi di root (supponendo che non sia già necessario per qualcos'altro). system(3), popen(3) e fork(3)/exec(3) sono i tuoi amici.

+0

Mi auguro che tu abbia fornito una spiegazione migliore del metodo system/exec ping. Questo sarebbe stato estremamente utile. – CaptainBli

10

Non c'è ancora una risposta accettata e mi sono imbattuto in questa domanda mentre cercavo di fare esattamente ciò che è stato chiesto qui, quindi volevo fare riferimento a Aif's risposta here.
Il seguente codice è basato sul suo esempio e ping DNS pubblico di Google in un processo figlio e stampa l'output nel processo padre.

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