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.
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.
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!"
Vous devriez vraiment poster:
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')