2013-05-08 15 views
12

Ho esaminato la documentazione per SocketServer. Ho copiato il codice del server TCP dalla documentazione e funziona correttamente. Tuttavia, ho notato che ogni volta che CTRL-c'ed fuori dal programma nel mio terminale, e poi provato a farlo funzionare di nuovo, vorrei avere il seguente errore:SocketServer: eliminazione di "[Errno 98] Indirizzo già in uso"

socket.error: [Errno 98] Address already in use 

ho guardato in su come risolvere il problema leggendo this e this. Ho aggiunto la seguente riga al mio codice per cercare di consentire il riutilizzo di indirizzo:

server.allow_reuse_address = True 

Sono ancora lo stesso problema anche con la linea di cui sopra ha aggiunto. Ho anche aggiunto uno try e except alla mia funzione server.serve_forever(), rilevando l'eccezione KeyboardInterrupt e chiamando server.shutdown() e server.socket.close() nella speranza che l'indirizzo venga liberato.

Ecco tutta la misura del mio codice server TCP (Nota: ho escluso la classe MyTCPHandler):

if __name__ == "__main__": 
    HOST, PORT = '', 9999 

    # Create the server, binding to localhost on port 9999 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
    server.allow_reuse_address = True 

    # Activate the server; this will keep running until you 
    # interrupt the program with Ctrl-C 
    try: 
     server.serve_forever() 
    except KeyboardInterrupt: 
     server.shutdown() 
     server.socket.close() 

ancora sto ottenendo l'errore che esegue il codice di cui sopra e aspettare vicino ad un minuto fino a quando l'indirizzo è finalmente liberato. Questo è frustrante quando eseguo il debug e cambio continuamente il mio codice.

Sto eseguendo questo codice utilizzando Python 2.7.3 su un RaspberryPi con Raspbian "Wheezy" 7.0.

risposta

18
... 
SocketServer.TCPServer.allow_reuse_address = True 
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
... 

allow_reuse_address dovrebbe essere sulla classe, non sulla istanza.

+0

Ha funzionato. Grazie! –