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

StackOverflow https://stackoverflow.com/questions/2274320

Вопрос

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

ошибка сокета:[Errno 98] Адрес уже используется.

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

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

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

Это было полезно?

Решение 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.

Другие советы

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

   SocketServer.ThreadingTCPServer.allow_reuse_address = True
   server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler)
   server.serve_forever()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top