13

cannot-bind-to-address-after-socket-program-crashesのフォローアップとして、プログラムの再起動後に次のエラーが発生しました。

socket.error: [Errno 98] アドレスは既に使用されています

この特定のケースでは、ソケットを直接使用する代わりに、プログラムは独自のスレッド化された TCP サーバーを起動しています。

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler)
httpd.serve_forever()

このエラー メッセージを修正するにはどうすればよいですか?

4

2 に答える 2

18

上記の解決策は私にはうまくいきませんでしたが、これはうまくいきました:

   SocketServer.ThreadingTCPServer.allow_reuse_address = True
   server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler)
   server.serve_forever()
于 2010-06-29T04:09:00.050 に答える
16

この特定のケースでは、オプションが設定されている.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)ときに、TCPServer クラスから呼び出すことができます。allow_reuse_addressそのため、次のように解決できました。

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler, False) # Do not automatically bind
httpd.allow_reuse_address = True # Prevent 'cannot bind to address' errors on restart
httpd.server_bind()     # Manually bind, to support allow_reuse_address
httpd.server_activate() # (see above comment)
httpd.serve_forever()

とにかく、これは便利かもしれないと思いました。ソリューションは、Python 3.0 では若干異なります

于 2010-02-16T16:17:02.727 に答える