2011-09-20 14 views
5

El programa se conecta a un servidor, y cuando la conexión está cerrada por el servidor, si intento volver a conectarlo dice: socket.error: [Errno 9] Bad file descriptor
Si cierro el socket en el cliente y luego trato de reconectar, dice: socket.error: [Errno 106] Transport endpoint is already connected.¿Cómo puedo volver a conectar un enchufe después de una tubería rota?


¿Hay alguna manera de volver a conectarlo después de una tubería rota sin crear una toma nueva?

import socket 
host = '127.0.0.1' 
port = 1337 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
def loop(): 
    try: 
     while 1: 
      print s.recv(512) 
    except socket.error: 
     #s.close()? 
     connect() 
def connect(): 
    s.connect((host, port)) 
    loop() 
connect() 

Respuesta

9

Asumiendo que este es un conector orientado a conexión:

No. Usted tiene que cerrar la anterior y crear un nuevo socket,

+1

La razón de esto es que una conexión de socket se gestiona en el nivel del sistema operativo (y esto se aplica a cualquier lenguaje de programación). En Linux, se asigna un descriptor de archivo para la conexión que se destruye cuando se cierra la conexión, por lo que debe volver a conectarse, lo que crea un nuevo descriptor de archivo. – EdwardGarson

1

Si el descriptor de archivo es malo, entonces necesitará para liberar ese recurso y crea un nuevo socket. Esto te dará un nuevo descriptor de archivo.

Si la conexión finalizó anormalmente, tendrá que esperar que el servidor cierre su extremo de la conexión antes de que pueda volver a conectarse. Solo lo sondearía con frecuencia (pero no con demasiada frecuencia) para ver si puede restablecer una conexión con su nuevo socket.

¿Con qué frecuencia obtiene el error de tubería incorrecta?

+0

Aparece el error cuando cierro la conexión en el servidor. Lo que me pregunto si hay una forma de volver a conectarse al servidor con el mismo socket. –

Cuestiones relacionadas