2010-02-16 5 views
10

En tant que suivi de cannot-bind-to-address-after-socket-program-crashes, je recevais cette erreur après mon programme a été relancé:SocketServer.ThreadingTCPServer - ne peut pas lier à l'adresse après le redémarrage du programme

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

Dans ce cas particulier, au lieu d'utiliser une prise directement, le programme démarre son propre serveur TCP threadé:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler) 
httpd.serve_forever() 

Comment puis-je corriger ce message d'erreur?

Répondre

11

Dans ce cas particulier, .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) peut être appelée à partir de la classe TCPServer lorsque l'option allow_reuse_address est définie. Donc, j'ai été capable de le résoudre comme suit:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler, False) # Do not automatically bind 
httpd.allow_reuse_address = True # Prevent 'cannot bind to address' errors on restart 
httpd.server_bind()  # Manually bind, to support allow_reuse_address 
httpd.server_activate() # (see above comment) 
httpd.serve_forever() 

Quoi qu'il en soit, pensé que cela pourrait être utile. La solution sera légèrement différent en Python 3.0

+0

Celui-ci a fonctionné pour moi, mais pas au-dessus! Merci. –

16

La solution ci-dessus ne fonctionne pas pour moi, mais celui-ci a fait:

SocketServer.ThreadingTCPServer.allow_reuse_address = True 
    server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler) 
    server.serve_forever() 
+0

Intéressant, quelle version de Python utilisez-vous? –

+0

2.6.1 sous Mac OSX. – Lynn

+0

même ici, cela fonctionne mais pas un avec httpd.server_bind() Python 2.6.5 – rombarcz

Questions connexes