Pythonでソケットを使用する方法を学んでいますが、プログラムがクラッシュしたり、Ctrl + Cキーを押したりすると、サーバーソケットがポートでリッスンしたままになることがよくあります。これにより、プログラムが再起動したときにそのポートでリッスンすることが明らかに停止するため、変更を続ける必要があります。
どこかで socket.close() を実行する必要があると思いますが、どこで?
Pythonでソケットを使用する方法を学んでいますが、プログラムがクラッシュしたり、Ctrl + Cキーを押したりすると、サーバーソケットがポートでリッスンしたままになることがよくあります。これにより、プログラムが再起動したときにそのポートでリッスンすることが明らかに停止するため、変更を続ける必要があります。
どこかで socket.close() を実行する必要があると思いますが、どこで?
atexitモジュールを試すことができます。
import atexit
function close_socket:
s.close()
atexit.register(close_socket)
問題がテスト中にポートが使用可能になるのが遅れている場合はSO_REUSEADDR
、TCP スタックでタイムアウトを待つのではなく、すぐにポートを再度バインドできるように設定することをお勧めします。
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
プログラムを終了すると、そのすべてのソケットが自動的に閉じられます。ただし、その後も TCP ポートは引き続き使用されます。UNIX ソケット FAQのセクション 2.7 には、非常に長い説明があります。
テスト目的では、任意のポートを要求 (または 8000、8001、8002 などの連続するポートを要求) し、そのポートをコンソールに出力するのが最善の方法です。