7

私は次のようなPythonを少し使っています:

HOST = '127.0.0.1'
PORT = 43434
single = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    single.bind((HOST, PORT))
except socket.error as e:
    # Print an error, exit.

過去にはうまく機能していましたが、現在はエラーが発生します[Errno 98] Address already in use。SIGINT ハンドラーはソケット接続を閉じるため、どのようにしてその状態になったのかはわかりませんが、今のところ修正しようとしています。

両方とも、そのポートを使用しているものは何もないlsofと言います:netstat

[$]> sudo netstat -an | grep 43434
[$]> sudo lsof -i :43434

TIME_WAITに従って 60 秒に設定されて/proc/sys/net/ipv4/tcp_fin_timeoutいますが、最後の実行が正常に完了してから数時間後にエラーが発生します。

REUSEADDR(一時的に)設定(経由)を試みましsingle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)たが、効果がないようです。

ターネーションで何が起こっているのですか?マシンを再起動しなくても、このポートを再び使用できるようになりますか?

4

3 に答える 3

1

これを試してください:
tcpkill -i eth0 ポート 43434

于 2013-10-17T06:02:56.930 に答える
1

コメントを追加したかったのですが、できません。だからこう答えざるを得ない。私の経験では、ソケットを正常に機能させるには、次のことを行う必要がありました。自分でタイムアウトを明示的に設定する必要がありました。

Python バージョン 2.3 以降を使用している場合は、ソケットを開く前にコードでこれを設定する必要があります。私は通常、30 秒のタイムアウトから始めて、特定の Web サイトで機能するように調整します。このパラメーターを使用しないと、不安定な問題が発生します。

socket.setdefaulttimeout(timeout)

オープン後に行ったその他の問題は、次の例外のいくつかをキャッチすることです。

            except socket.gaierror, err:
                # you might want to handle this
            except socket.sslerror, err2:
                # you might want to handle this if doing SSL
于 2013-11-25T12:48:08.223 に答える
0

SO_REUSEPORTソケットオプションを設定してみてください。ただし、競合するソケットがバインドされる前に SO_REUSEPORT オプションも設定されている場合にのみ機能するため、クリーンな再起動後に試してください。

ただし、Pythonコードは投稿したコードのように見えると言いました。バインディングのみをテストするために、プログラムの非常に単純化されたバージョンを実際に試しましたか?

プログラムのトレースを試みることもできます。

于 2013-11-05T08:21:08.133 に答える