SocketServer: избавление от "[Errno 98] адрес уже используется"
Я просматривал документацию для SocketServer
. Я скопировал код TCP-сервера из документации, и он работает нормально. Однако я заметил, что всякий раз, когда я ctrl-c'Ed из программы в моем терминале, а затем попытался запустить его снова, я получал следующую ошибку:
socket.error: [Errno 98] Address already in use
Я посмотрел, как исправить проблему, прочитав этой и этой. Я добавил следующую строку в мой код, чтобы попытаться разрешить повторное использование адрес:
server.allow_reuse_address = True
Я все еще испытываю ту же проблему даже с добавленной выше строкой. Я также добавил try
и except
вокруг server.serve_forever()
функция, ловя исключение KeyboardInterrupt и вызывая server.shutdown()
и server.socket.close()
в надежде, что адрес будет освобожден.
вот полный экстент моего кода сервера TCP (примечание: Я исключил класс MyTCPHandler):
if __name__ == "__main__":
HOST, PORT = '', 9999
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.allow_reuse_address = True
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
try:
server.serve_forever()
except KeyboardInterrupt:
server.shutdown()
server.socket.close()
Я все еще получаю ошибку при запуске кода выше и должен ждать почти минута, пока адрес не будет наконец освобожден. Это расстраивает, когда я постоянно отлаживаю и меняю свой код.
я запускаю этот код с помощью Python 2.7.3 на RaspberryPi под управлением Raspbian "Wheezy" 7.0.
1 ответов
...
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
...
allow_reuse_address
должно быть в классе, а не в экземпляре.