web-dev-qa-db-ja.com

Python [Errno 98]アドレスはすでに使用されています

Pythonソケットプログラムでは、時々それを中断する必要があります Ctrl-C。これを行うと、socket.close()を使用して接続が閉じられます。

ただし、再開しようとすると、再び接続できるようになるまで1分かかるように待たなければなりません。ソケットを正しく閉じる方法は?または、これは意図したものですか?

76
skylerl

はい、意図されています。ここで 詳細な説明 と読むことができます。ソケットにSO_REUSEADDRオプションを設定することにより、この動作をオーバーライドできます。例えば:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
98
Bartosz
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211
22
ayoub laaziz

SocketServerモジュールでTCPServer、UDPServer、またはそれらのサブクラスを使用する場合、このクラス変数を設定できます(サーバーをインスタンス化する前に)。

SocketServer.TCPServer.allow_reuse_address = True

(経由で SocketServer.ThreadingTCPServer-プログラムの再起動後にアドレスにバインドできません

これにより、init(コンストラクター)は次のことを行います。

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
15
dirkk0

私のために働いた簡単な解決策は、ターミナルを閉じて再起動することです。

3

HTTPServer(( ''、443)、myHandler)を呼び出す前に、このコマンドを使用してサブプロセスを実行する以外、何も機能しませんでした。

kill -9 $(lsof -ti tcp:443)

もちろん、これはLinuxのようなOS専用です!

2
Mirko

すでに実行されている同じポートでサービスを実行しようとしているためです。

サービスがプロセススタックで停止されていないために発生する場合があります。あなたはそれらを殺さなければなりません

何もインストールする必要はありません実行中のすべてのpythonプロセスを強制終了する1行のコマンドです。

LinuxベースのOSの場合:

バッシュ:

kill -9 $(ps -A | grep python | awk '{print $1}')

魚:

kill -9 (ps -A | grep python | awk '{print $1}')
1
MohitGhodasara

同じエラーが発生しました:
手順は次のとおりです。
1-使用済み$ ps -fA | grep python
2-すべてのプロセスを強制終了しました
3-閉じたターミナル
4-アプリケーションを再起動して起動しました(mkchromecast)。
5-このエラーメッセージは表示されませんでした。

別の問題があります。そのフォローアップ。

0
vb217