SocketServer. ThreadingTCPServer - не Может связать для обращения после перезапуска программы

Как продолжение cannot-bind-to-address-after-socket-program-crashes, я получал эту ошибку после того, как моя программа была перезапущена:

socket.error: [Errno 98] Адрес, уже используемый

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

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

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

10
задан Community 23 May 2017 в 12:33
поделиться

2 ответа

В данном конкретном случае .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

11
ответ дан 3 December 2019 в 15:51
поделиться

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

   SocketServer.ThreadingTCPServer.allow_reuse_address = True
   server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler)
   server.serve_forever()
16
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: