web-dev-qa-db-ja.com

SocketServer:「[Errno98]アドレスはすでに使用されています」を削除します

SocketServer のドキュメントを見てきました。ドキュメントからTCPサーバーコードをコピーしましたが、正常に動作します。しかし、ターミナルのプログラムをCtrl-Cキーを押して終了するたびに、もう一度実行しようとしたことに気付きました。 、次のエラーが発生します。

_socket.error: [Errno 98] Address already in use
_

thisthis を読んで、問題を解決する方法を調べました。アドレスの再利用を許可するために、コードに次の行を追加しました。

_server.allow_reuse_address = True
_

上記の行を追加しても、同じ問題が発生します。また、server.serve_forever()関数の周りにtryexceptを追加し、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()
_

上記のコードを実行してもエラーが発生し、アドレスが最終的に解放されるまで1分近く待つ必要があります。コードを絶えずデバッグおよび変更している場合、これはイライラします。

Raspbian "Wheezy" 7.0を実行しているRaspberryPiでPython 2.7.3を使用してこのコードを実行しています。

16
rafiki_rafi
...
SocketServer.TCPServer.allow_reuse_address = True
server = SocketServer.TCPServer((Host, PORT), MyTCPHandler)
...

allow_reuse_addressは、インスタンスではなく、クラスに存在する必要があります。

24
tidy