Как продолжение cannot-bind-to-address-after-socket-program-crashes, я получал эту ошибку после того, как моя программа была перезапущена:
socket.error: [Errno 98] Адрес, уже используемый
В данном случае, вместо того, чтобы использовать сокет непосредственно, программа запускает свой собственный потоковый сервер TCP:
httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler)
httpd.serve_forever()
Как я могу исправить это сообщение об ошибке?
В данном конкретном случае .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()