real - Prueba de conexión de socket en Python
socket python 3 español (3)
Parece que no captas la excepción que quieres alcanzar :)
si el 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 trata de ver qué tipo de excepción es lo que estás 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, incapacidad para resolver direcciones, etc.) y hacer una declaración de except
separada para cada uno de ellos - de esta manera podrá reaccionar de manera diferente para un tipo diferente de problemas
Esta pregunta se ampliará en: Mejor manera de abrir un socket en Python
Al abrir un socket, ¿cómo puedo probar para ver si se ha establecido y que no ha excedido el tiempo de espera, o que generalmente falla?
Editar: Intenté esto:
try:
s.connect((address, ''80''))
except:
alert(''failed'' + address, ''down'')
pero se llama a la función de alerta incluso cuando esa conexión debería haber funcionado.
Puede usar la función connect_ex . No arroja 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:
- El código fuente completo de tu ejemplo
- El resultado real de esto, 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, obtengo el mensaje esperado:
Something''s wrong with (''::1'', 80, 0, 0). Exception type is (111, ''Connection refused'')