Подтвердить что ты не робот

SocketServer: избавиться от '[Errno 98] Адрес уже используется'

Я смотрел документацию для SocketServer. Я скопировал код сервера TCP из документации, и он работает нормально. Тем не менее, я заметил, что всякий раз, когда я закрывал программу в своем терминале, а затем пытался запустить ее снова, я получил бы следующую ошибку:

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.

4b9b3361

Ответ 1

...
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
...

allow_reuse_address должен находиться в классе, а не в экземпляре.