2010-02-16 7 views
10

Als Follow-up zu cannot-bind-to-address-after-socket-program-crashes adressieren, war ich erhalte diese Fehler nach meinem Programm neu gestartet wurde:SocketServer.ThreadingTCPServer - binden kann nicht nach dem Neustart des Programms

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

In diesem speziellen Fall, sondern eine Fassung des Verwendens direkt startet das Programm einen eigenen Thread-TCP-Server:

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

Wie kann ich diese Fehlermeldung beheben?

Antwort

11

In diesem speziellen Fall kann .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) aus der TCPServer-Klasse aufgerufen werden, wenn die Option allow_reuse_address festgelegt ist. So war ich in der Lage, es zu lösen, wie folgt:

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

Wie auch immer, dachte dies nützlich sein könnte. Die Lösung wird unterscheiden sich geringfügig in Python 3.0

+0

Dieses ist für mich gearbeitet, aber nicht die oben! Vielen Dank. –

16

Die obige Lösung nicht für mich arbeiten, aber dies tat:

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

Interessant, welche Version von Python verwendest du? –

+0

2.6.1 unter Mac OSX. – Lynn

+0

gleich hier, das funktioniert aber nicht mit httpd.server_bind() Python 2.6.5 – rombarcz

Verwandte Themen