1. ホーム
  2. python

[解決済み] Pythonです。ソケットをバインドする "アドレスは既に使用されています"

2023-01-16 01:41:07

質問

TCP/IPネットワーク上のクライアントソケットについて質問があります。例えば、私が

try:

    comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

except socket.error, msg:

    sys.stderr.write("[ERROR] %s\n" % msg[1])
    sys.exit(1)

try:
    comSocket.bind(('', 5555))

    comSocket.connect()

except socket.error, msg:

    sys.stderr.write("[ERROR] %s\n" % msg[1])

    sys.exit(2)

作成されたソケットは、ポート5555にバインドされます。問題は、接続を終了した後

comSocket.shutdown(1)
comSocket.close()

wiresharkを使用すると、私は両方の側からFIN、ACK、ACKでソケットが閉じ、私は再びポートを使用することはできません参照してください。次のようなエラーが発生します。

[ERROR] Address already in use

どうすれば、すぐにポートをクリアして、次回も同じポートを使用できるようになるのでしょうか。

comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

setsockoptでは解決できないようです ありがとうございました

どのように解決するのですか?

を使用してみてください。 SO_REUSEADDR ソケットオプションを使ってみてください。

comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

編集します。 まだお困りのようですね。 というケースがあります。 SO_REUSEADDR が機能しない場合があります。 ソケットをバインドして、同じ宛先に再接続しようとすると、( SO_REUSEADDR が有効になっている) 場合は TIME_WAIT はまだ有効です。 しかし、これは異なるホストとポートに接続することを可能にします。

2 つの解決策が思い浮かびます。 再び接続できるようになるまで再試行を続けることができます。 または、クライアントが (サーバーではなく) ソケットを閉じることを開始した場合、魔法のように動作するはずです。