Prueba de conexión de socket en Python

Esta pregunta se expandirá en: La mejor manera de abrir un socket en Python
Al abrir un zócalo, ¿cómo puedo realizar una prueba para ver si se ha establecido y que no se ha agotado el tiempo de espera o, en general, ha fallado?

Edit: he intentado esto:

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

pero la función de alerta se llama incluso cuando esa conexión debería haber funcionado.

Parece que no atrapas la excepción que quieres atrapar allí 🙂

si s es un objeto socket.socket() , entonces la forma correcta de llamar a .connect sería:

 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() 

Siempre intente ver qué tipo de excepción es lo que está capturando en un bucle de prueba de excepción.

Puede verificar qué tipos de excepciones en un módulo de socket representan qué tipo de errores (tiempo de espera, no se puede resolver la dirección, etc.) y hacer una statement de except por separado para cada uno de ellos: de esta manera podrá reactjsr de manera diferente para cada tipo. de problemas

Puede utilizar la función connect_ex . No lanza una excepción. En lugar de eso, devuelve un valor entero de estilo C (denominado 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!" 

Realmente deberías publicar:

  1. El código fuente completo de tu ejemplo.
  2. El resultado real de la misma, no un resumen.

Aquí está mi código, que funciona:

 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)) 

Cuando el servidor escucha, no obtengo nada (esto es normal), cuando no lo hace, recibo el mensaje esperado:

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