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 должно быть в классе, а не в экземпляре.