5

閉じたクライアントソケットがelistに追加されましたが、selectが呼び出された場合のexにも例外はありません。理由はわかりませんが、手伝ってくれませんか。本当にありがとう!

r,w,ex = select.select(rlist, wlist,elist )
    for s in ex:
       print "catch a closed socket error!"
4

1 に答える 1

6

ソケットが閉じられているイベントをキャッチするには、ソケットをに入れる必要がありますrlist。反対側で接続が閉じられると、戻り、閉じたソケットが読み取りselectの準備ができていることを示します(つまり、リストにあります)。このソケットで実行し、空のリスト(何も読み取られていない)を返す場合は、接続が閉じられたことを意味します。rrecv

 data = s.recv(size) 
 if not data: 
    # socket has been closed by peer
    s.close()

私が見たところ、例外リスト(selectの最後のパラメーター)は広く使用されていません。これに関する主な問題は、OSが異なればこのパラメーターの解釈も異なることです。例外ではないように思われる場合(OOBデータ)にのみ使用されることもあります。

socketモジュールのドキュメントは、その引数が何を意味するかについて具体的ではないため、一般的に、それに依存することはお勧めできません。

xlist:「例外的な状態」を待ちます(システムがそのような状態と見なすものについては、マニュアルページを参照してください)

于 2012-08-14T09:51:44.867 に答える