2010-02-16 2 views
10

В качестве последующих мер по cannot-bind-to-address-after-socket-program-crashes, я получаю эту ошибку после того, как моя программа была возобновлена:SocketServer.ThreadingTCPServer - Невозможно привязать к решению после перезапуска программы

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

В данном случае, вместо того чтобы использовать сокет напрямую, программа запускает собственный поточный TCP-сервер:

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

Как исправить это сообщение об ошибке?

ответ

11

В этом конкретном случае .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) может быть вызван из класса TCPServer, если установлен параметр allow_reuse_address. Поэтому я смог решить эту проблему следующим образом:

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

В любом случае, подумал, что это может быть полезно. Решение будет немного отличаться в Python 3.0

+0

Это один работал для меня, но не выше! Благодарю. –

16

выше решение не работает для меня, но это один сделал:

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

Интересно, какую версию Python вы используете? –

+0

2.6.1 под Mac OSX. – Lynn

+0

такой же здесь, но это не работает с httpd.server_bind() Python 2.6.5 – rombarcz