12

Python で記述されたクライアント サーバー アーキテクチャがあります。ほとんどの場合は問題なく動作しますが、サーバーを停止してすぐに再起動すると、次のエラーが発生することがあります。

Accept failed due to : 22 メッセージ Invalid argument, error: [Errno 22] Invalid argument

ただし、数分待ってから同じスクリプトを変更せずに再度開始すると、正常に動作します。

これは、クライアントからの着信接続を受け入れるためにサーバーで使用するループです。

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('',port))
    s.listen(1)
except:
    #logError()

while True:
    try:
        conn, address = s.accept() #THIS ACCEPT FAILS SOMETIMES
        multiprocessing.Process(target=HandleConnection, args=(conn, address, messageQueue, taskQueue, IOLock, numberOfConnections, numberOfConnectionsLock,resultsDirectory)).start()
    except socket.error, msg:
      #logError()  -> this except catches the error

サーバーを実行した後、しばらくポートがブロックされますか? もしそうなら、ポートがブロックされているかどうかを照会し、サーバーを終了した直後にサーバーを再起動したい場合、ブロックが解除されるまで待つ方法はありますか?

4

1 に答える 1

10

SO_REUSEADDRバインドする前に設定する必要があります。

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

そうしないと、ソケットがバインドされない可能性があるため、accepting 時にエラーが発生します。最初のブロックで例外をチョークしていなければ、このエラーに気付くでしょう。

于 2013-02-13T20:45:19.393 に答える