2010-12-27 11 views
2

J'ai écrit un programme en C qui communique via udp avec un Arduino. Ma question est, comment puis-je "ping" une adresse IP et obtenir seulement 1 ou 0 (disponible ou non) en C (unix).Vérifier si le périphérique est "connecté"/disponible

L'appel system("ping xxx.xxx.xxx.xxx"); ne fonctionne pas car il affiche une liste ...?

Répondre

2
system("ping -c 1 127.0.0.1 > /dev/null"); 

devrait faire l'affaire. -c 1 n'envoie qu'un seul paquet. Nous passons à /dev/null car nous ne nous soucions pas de la sortie sur stdout (est-ce la liste à laquelle vous faites référence?). Si vous voulez également rejeter stderr, ajoutez un 2>&1 à la fin. Vous pouvez également limiter le temps de réponse en utilisant -W.

L'appel renverra un entier représentant le succès ou l'échec. 0 indique le succès, tandis qu'un entier différent de zéro représente un échec. Voici quelques exemples de code: http://ideone.com/cf0eR

Sachez qu'un ping échoué ne garantit pas que le périphérique est hors ligne. Bien que dans votre environnement contrôlé, il est probablement raisonnable de s'attendre à ce que cela fonctionne.

+0

Je l'ai essayé mais il ne sort rien si le périphérique est connecté ou pas ... – JNK

+0

@JNK La fonction 'system()' renvoie un entier, comme je l'ai expliqué. J'ai délibérément jeté toutes les autres sorties en redirigeant vers/dev/null. – marcog

+0

Mon erreur ... fonctionne! : D – JNK

2

En général, vous ne pouvez pas déterminer si un hôte réseau est actif - un membre d'un réseau IP est autorisé à n'envoyer aucun paquet. Le meilleur moyen est simplement de commencer la communication et d'utiliser un protocole qui oblige la machine contactée à répondre de quelque manière que ce soit. Toutefois, si vous êtes sûr que la machine répond à la requête ping, mais pas à vos paquets UDP, utilisez ping -c 1 192.0.32.10. Cette solution est très fragile si:

  • La machine ne peut pas répondre à un ping
  • Le réseau (par exemple un pare-feu entre vous et l'hôte) ne peut pas transmettre votre message ping, mais relayait les paquets UDP fins
  • Le réseau peut réellement changer à tout moment. Lorsque vous recevez une réponse ping, tout ce que vous savez est que l'hôte distant était lorsque vous avez envoyé le message
Questions connexes