2009-09-23 6 views
2

Notre équipe développe un périphérique Internet Media basé sur Linux 2.6. Actuellement, nous détectons si la connectivité Internet est établie (via une connexion Ethernet filaire) en envoyant une requête ping à www.google.comMéthodes intelligentes pour un périphérique Linux embarqué pour détecter la connectivité Internet

Certains réseaux sur lesquels nous avons testé le périphérique ne prennent pas en charge le transfert de paquets ICMP, de sorte que notre code d'application signale par erreur Internet. comme indisponible dans ce cas. Est-ce que quelqu'un connaît une approche plus raffinée pour déduire si la connectivité Internet est disponible via/dev/eth0 sans avoir recours au ping d'un service bien connu?

+0

J'ai répondu à cette question, c'est une dupe de. Vous pouvez le vérifier. –

+0

Salut Pavel, vous faites un point intéressant. Qu'est-ce qui est "connecté"? et il existe en effet des idées différentes sur la façon dont un utilisateur final doit être "connecté". Pour nos applications, notre appareil doit pouvoir résoudre les adresses DNS et effectuer des échanges de messages arbitraires avec une grande variété d'autres machines (homologues) sur Internet, dont l'identité n'est connue qu'à l'exécution. Personnellement, je suis satisfait de la vérification par défaut proposée par ChristopheD. L'approche d'écho ICMP était clairement défectueuse puisque de nombreux administrateurs de liens réseau interdisent tous les types de trafic ICMP sur leurs liaisons. – sototozo

Répondre

4

Comme le gars qui a écrit cette réponse référencée par ChristopheD, ce n'est pas l'approche que je vais utiliser ici. Cela a fonctionné pour l'autre question, car dans ce cas nous vérifions la présence d'un lien PPP direct depuis la machine actuelle - dans ce cas, vous êtes connecté à un réseau quelconque qui peut ou non déjà avoir une route par défaut, indépendant de sa connectivité Internet plus large. Comme vous avez besoin d'une connectivité DNS globale pour votre application, je vérifie pour cela - rechercher une adresse qui existera toujours - comme une requête de type NS pour le domaine com.. Utilisez un délai d'attente raisonnablement long et/ou réessayez quelques fois avant d'abandonner. Quelque chose comme ceci:

dig NS +aaonly com. 

Ignore la sortie et tester la valeur de sortie - 0 indique la recherche a été en mesure de contacter les serveurs racine, toute autre chose et il n'a pas été.

2

En fin de compte vous voulez que l'appareil puisse utiliser Internet pour une fonction utile. S'il existe un serveur bien défini auquel le périphérique se connecte généralement, il est utile d'envoyer une requête à cet endroit.

Entre « rien » et « fonction utile » il y a beaucoup d'étapes, et vous pourriez éventuellement vérifier ces objets comme une mesure de la « connectivité »: câble

  • Ethernet branché (ou un lien PPP établi ou Wi-Fi, quel que soit votre couche faible)
  • serveur DHCP adresse attribuée (le cas échéant)
  • passerelle par défaut fonctionne
  • serveur DNS répond
  • serveur de destination répond (peut-être pas un ping ICMP, mais une petite requête HTTP ou tout autre protocole que vous pourriez utiliser)

En fonction de la qualité de votre client, ou si vous voulez une erreur/diagnostic utile qu'ils peuvent signaler au support technique, il pourrait être utile de détecter tout cela.

Peut-être aussi utile de pouvoir faire un traceroute comme outil de diagnostic.