web-dev-qa-db-fra.com

Test de la connexion socket dans Python

Cette question se développera sur: Meilleur moyen d'ouvrir un socket en Python
.

Edit: J'ai essayé ceci:

try:
    s.connect((address, '80'))
except:
    alert('failed' + address, 'down')

mais la fonction d'alerte est appelée même lorsque cette connexion aurait dû fonctionner.

22
UnkwnTech

Il semble que vous n'attrapiez pas l'exception que vous voulez attraper :)

si s est un objet socket.socket(), alors la bonne façon d'appeler .connect serait:

import socket
s = socket.socket()
address = '127.0.0.1'
port = 80  # port number is a number, not string
try:
    s.connect((address, port)) 
    # originally, it was 
    # except Exception, e: 
    # but this syntax is not supported anymore. 
except Exception as e: 
    print("something's wrong with %s:%d. Exception is %s" % (address, port, e))
finally:
    s.close()

Essayez toujours de voir quel type d'exception correspond à ce que vous attrapez dans une boucle try-except.

Vous pouvez vérifier quels types d'exceptions dans un module de socket représentent le type d'erreurs (délai d'expiration, impossible de résoudre l'adresse, etc.) et créer une instruction except distincte pour chacune d'entre elles - de cette façon, vous pourrez réagir différemment pour différents types de problèmes.

37
kender

Vous pouvez utiliser la fonction connect_ex . Cela ne fait pas exception. Au lieu de cela, renvoie une valeur entière de style C (appelée errno en C):

s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex((Host, port))
s.close()
if result:
    print "problem with socket!"
else:
    print "everything it's ok!"
8
ssoto

Vous devriez vraiment poster:

  1. Le code source complet de votre exemple
  2. Le résultat réel, pas un résumé

Voici mon code, qui fonctionne:

import socket, sys

def alert(msg):
    print >>sys.stderr, msg
    sys.exit(1)

(family, socktype, proto, garbage, address) = \
         socket.getaddrinfo("::1", "http")[0] # Use only the first Tuple
s = socket.socket(family, socktype, proto)

try:
    s.connect(address) 
except Exception, e:
    alert("Something's wrong with %s. Exception type is %s" % (address, e))

Lorsque le serveur écoute, je ne reçois rien (c'est normal), quand ce n'est pas le cas, je reçois le message attendu:

Something's wrong with ('::1', 80, 0, 0). Exception type is (111, 'Connection refused')
5
bortzmeyer