2011-11-18 3 views
12

Y at-il un moyen de faire un ping sur une adresse IP spécifique avec C? Si je voulais pinguer "www.google.com" avec un certain nombre de pings, ou d'ailleurs, une adresse locale, j'aurais besoin d'un programme pour le faire. Comment puis-je ping à partir de C?Y at-il un moyen de faire un ping sur une adresse IP spécifique avec C?

+0

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

+0

Pourquoi voudriez-vous faire un ping sur Google, en supposant que vous ne travailliez pas pour Google? – dbasnett

+0

Il est spécifique au système d'exploitation. Et 'www.google.com' n'est pas une adresse IP (mais' 192.168.2.34' en est une). –

Répondre

3

Vous devrez apprendre les sockets, résoudre l'hôte que vous voulez exécuter, envoyer les paquets ICMP appropriés et écouter une réponse. Il n'y a pas de fonction ping dans la bibliothèque standard. Cependant, il existe de nombreuses bibliothèques réseau de niveau supérieur qui implémentent déjà le protocole.

9

Vous pouvez concevoir votre propre ICMP packets en utilisant raw sockets, mais est loin d'être trivial. Le source code for ping(1) est un bon point de départ pour déterminer comment procéder (il utilise une licence de type BSD, voir le code source de la licence complète). Gardez à l'esprit que les sockets raw nécessitent des privilèges root sous Linux, donc votre programme devra être setuid root.

Bien sûr, il est beaucoup plus facile de débourser vers l'exécutable ping(1) et de ne pas avoir à faire face à tout cela vous-même. Vous n'aurez pas à vous inquiéter des licences de code, et votre programme n'aura pas besoin de privilèges root (en supposant qu'il n'en a pas besoin pour autre chose). system(3), popen(3), et fork(3)/exec(3) sont vos amis.

+0

Je souhaite que vous ayez donné une meilleure explication de la méthode système/exécution. Cela aurait été extrêmement utile. – CaptainBli

10

Il n'y a pas de réponse acceptée et je suis tombé sur cette question en essayant de faire exactement ce qui a été demandé ici, donc je voulais me référer à Aif's répondre here.
Le code suivant est basé sur son exemple et envoie un ping au DNS public de Google dans un processus fils et imprime la sortie dans le processus parent.

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