Bonjour,
Voilà quelque chose qui a l'air de fonctionner.
Attention: c'est du Python 2.7 sous Windows (donc: console="cmd.exe" et encodage="cp850"): à convertir si nécessaire.
Envoi d'un ping et récupération de la réponse
J'utilise le module subprocess (=solution recommandée)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import subprocess
#############################################################################
def ping_pc(ip, encodage="cp850"):
"""envoie un ping à l'ordinateur d'adresse ip, et retourne la réponse
sous forme d'une liste de lignes unicode
"""
commande = ["ping", ip]
try:
out, _ = subprocess.Popen(commande,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT).communicate()
except (ValueError, OSError) as err:
return ("Erreur: %s" % (err.args[0],)).decode(encodage)
reponse = out.decode(encodage)
return reponse.splitlines() |
Exploitation de la réponse du ping
Selon la situation de l'adresse ip fournie, la réponse sera la suivante:
Cas d'erreur: retour d'une seule ligne
La requête Ping n'a pas pu trouver l'hôte www.xxxxxxxxx.fr. Vérifiez le nom et essayez à nouveau.
Cas d'un PC connecté (c'est ici mon disque réseau):
1 2 3 4 5 6 7 8 9 10 11
|
Envoi d'une requête 'Ping' 192.168.1.70 avec 32 octets de données*:
Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
Réponse de 192.168.1.70*: octets=32 temps<1ms TTL=64
Statistiques Ping pour 192.168.1.70:
Paquets*: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms |
A noter: la 1ère ligne est vide
Cas d'un PC non connecté (le PC est éteint):
1 2 3 4 5 6 7 8 9
|
Envoi d'une requête 'Ping' 192.168.1.91 avec 32 octets de données*:
Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
Réponse de 192.168.1.100*: Impossible de joindre l'hôte de destination.
Statistiques Ping pour 192.168.1.91:
Paquets*: envoyés = 4, reçus = 4, perdus = 0 (perte 0%), |
Il y a encore une 1ère ligne vide.
On voit que, par rapport au PC connecté, les 2 dernières lignes sont absentes. On pourrait aussi tester le texte "Impossible de joindre...", mais on aurait des problèmes de langue à gérer.
Pour l'exploitation de la réponse au ping, on va donc adopter la logique suivante:
1 2 3 4 5 6 7 8
| si la 1ère ligne n'est pas vide:
=> erreur
sinon:
on recherche la 1ère ligne vide suivante
s'il y a plus de 2 lignes après celle-ci:
=> le PC est connecté
sinon:
=> le PC n'est pas connecté |
Voilà le code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #############################################################################
def connectok(ip):
"""dit si un PC dont l'adresse ip est donnée, est connecté ou non"""
# envoi d'un ping à l'ip donné et saisie de la réponse
lignes = ping_pc(ip)
# si la 1ère ligne (=indice 0) n'est pas vide: erreur d'adresse
if len(lignes[0])!=0:
return ip + u" => nom de domaine introuvable"
else:
# recherche de la 1ère ligne vide au delà de la 1ère (=> indice k)
for i, ligne in enumerate(lignes[1:]):
if len(ligne)==0:
k = i+1
break
if len(lignes)-k > 3:
return ip + u" => connecté"
else:
return ip + u" => non connecté" |
Exemple d'utilisation:
1 2 3 4 5 6 7 8
| ip1 = "192.168.1.70" # PC connecté
ip2 = "192.168.1.91" # PC non connecté
ip3 = "www.google.fr" # adresse web valide (=> accès serveur DNS)
ip4 = "www.googleXXX.fr" # mauvaise adresse web (=> échec serveur DNS)
ips = [ip1, ip2, ip3, ip4]
for ip in ips:
print connectok(ip) |
Réponse:
1 2 3 4
| 192.168.1.70 => connecté
192.168.1.91 => non connecté
www.google.fr => connecté
www.googleXXX.fr => nom de domaine introuvable |
Je n'ai pas essayé sur Linux ou sur OS X, mais on devrait pouvoir s'inspirer du cas Windows ci-dessus pour adapter si nécessaire.
Ok?
Partager