2008-10-07 13 views
20

Esta pregunta se expandirá en: Best way to open a socket in Python
Al abrir un socket cómo puedo probar para ver si se ha establecido, y que no hizo tiempo de espera, o en general fallar.

Editar: yo probamos este:Prueba conexión de socket en Python

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.

+0

Siempre debe usar print_exc() del módulo de rastreo en la cláusula de excepción! eso indicará errores accidentales. – Alex

Respuesta

33

Parece que no capta la excepción que la captura quiero por ahí :)

si el s es un objeto socket.socket(), entonces la forma correcta de llamar .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 trate para ver qué tipo de excepción es lo que está atrapando en un ciclo try-except.

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 declaración except separada para cada uno de ellos - de esta manera usted podrá reaccionar diferente para diferentes tipos de problemas.

+2

Esto no parece funcionar, aún así, la función de alerta no se está llamando. – UnkwnTech

+1

intenta mover el conector en el bloque try: ¿Qué error obtendrás? – kender

+0

no se olvide de cerrar el zócalo después de probar que está abierto. :) – marathon

5

realmente debería mensaje:

  1. El código fuente completo de su ejemplo
  2. El real resultado 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, obtengo nada (esto es normal), cuando se no lo hace, me sale el mensaje esperado:

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

//, ¿Cómo funciona eso con la tarea '(family, socktype, proto, garbage, address) = \'? Por cierto, respuesta sólida. –

7

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

En caso de 'resultado> 0', obtendrá el [' errno'] (https://docs.python.org/3.3/library/errno.html) valor de la falla. A continuación, puede hacer algo como 'print errno.errorcode [result]' para obtener una pista más útil sobre el error. – Jens

Cuestiones relacionadas