2011-09-20 16 views
5

プログラムはサーバに接続し、サーバが接続を閉じると再接続しようとします:socket.error: [Errno 9] Bad file descriptor
クライアントのソケットを閉じて再接続しようとすると、socket.error: [Errno 106] Transport endpoint is already connectedと表示されます。破損したパイプの後にソケットを再接続するにはどうしたらいいですか?


新しいソケットを作成せずに壊れたパイプの後に再接続する方法はありますか?

これはコネクション指向のソケットであると仮定すると、
import socket 
host = '127.0.0.1' 
port = 1337 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
def loop(): 
    try: 
     while 1: 
      print s.recv(512) 
    except socket.error: 
     #s.close()? 
     connect() 
def connect(): 
    s.connect((host, port)) 
    loop() 
connect() 

答えて

9

:ファイル記述子が悪い場合は、古いものを閉じ、新しいソケットを作成し、

+1

これは、ソケット接続がオペレーティングシステムレベルで管理されているためです(これはプログラミング言語にも該当します)。 Linuxでは、ファイルディスクリプタが接続に割り当てられ、接続が閉じられると破棄されるため、新しいファイルディスクリプタを作成する再接続が必要です。 – EdwardGarson

1

する必要が

いいえ、あなたが解放する必要があります。そのリソースと新しいソケットを作成します。これにより、新しいファイル記述子が得られます。

接続が異常終了した場合は、サーバーが接続を終了してから再接続するまで待つ必要があります。あなたが新しいソケットとの接続を再確立できるかどうかを確認するために頻繁にポーリングします(頻繁ではありません)。

パイプ不良の頻度はどのくらいですか?

+0

サーバーで接続を閉じるとエラーが表示されます。同じソケットでサーバーに接続する方法があるのだろうか? –

関連する問題