2011-09-20 13 views
5

Il programma si connette a un server e quando la connessione viene chiusa dal server, se provo a riconnetterlo dice: socket.error: [Errno 9] Bad file descriptor
Se chiudo lo zoccolo nel client e quindi provo a riconnetterlo, si dice: socket.error: [Errno 106] Transport endpoint is already connected.Come posso ricollegare una presa dopo un tubo rotto?


C'è un modo per ricollegarlo dopo un tubo rotto senza creare un nuovo socket?

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

risposta

9

Assumendo questo è un socket orientato alla connessione:

No. È necessario chiudere il vecchio e creare un nuovo socket,

+1

Il motivo è che una connessione socket viene gestita a livello di sistema operativo (e ciò vale per qualsiasi linguaggio di programmazione). Sotto Linux, viene assegnato un descrittore di file per la connessione che viene distrutta quando la connessione viene chiusa, quindi è necessario riconnettersi per creare un nuovo descrittore di file. – EdwardGarson

1

Se il descrittore di file è male allora si avrà bisogno di rilasciare quella risorsa e creare un nuovo socket. Questo ti porterà un nuovo descrittore di file.

Se la connessione è terminata in modo anomalo, è necessario attendere che il server chiuda la fine della connessione prima di poter riconnettersi. Vorrei semplicemente interrogarlo frequentemente (ma non troppo spesso) per vedere se è possibile ristabilire una connessione con il nuovo socket.

Con quale frequenza viene visualizzato l'errore di pipe errato?

+0

Viene visualizzato l'errore quando chiudo la connessione nel server. Cosa mi chiedo se c'è un modo per riconnettersi al server con lo stesso socket. –