17

のドキュメントを見てきましたSocketServer。ドキュメントから TCP サーバー コードをコピーしたところ、問題なく動作しました。ただし、端末で ctrl-c を押してプログラムを終了し、再度実行しようとすると、次のエラーが発生することに気付きました。

socket.error: [Errno 98] Address already in use

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

server.allow_reuse_address = True

上記の行を追加しても、まだ同じ問題が発生しています。また、関数の前後にtryandを追加し、KeyboardInterrupt 例外をキャッチして and を呼び出し、アドレスが解放されることを期待しています。exceptserver.serve_forever()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 を使用してこのコードを実行しています。

4

1 に答える 1

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

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

于 2013-05-20T02:41:38.390 に答える