2013-06-30 7 views
13

私はPython 2.7.5でrawソケットインタフェース(import socket)を使ってアプリケーションを書いています。Python:何らかの理由でソケットが切断されたときを検出しますか?

何らかのイベントを登録する方法があるかどうか、またはTCPソケット接続がまだ確立されていない場合は、定期的な間隔で簡単にテストする方法があるかどうかを知る必要があります。

私が見つけたアドバイスのほとんどは、「ただ読もうとしていますが、終了した場合はエラーまたはバイトがありません」と表示されています。しかし、時々私はそれからreadに準備ができていないが、私はまだソケットが閉じられるかどうかを知りたいので、例えば私は手動で直ちに再接続することができます。

また、ソケットからreadを送信すると、バッファから読み取られたバイトが削除されるため、単に接続性をテストするためのread ingは実行可能ではないようです。

接続の有効性をチェックするバックグラウンドスレッドを持つことで問題は解決します。そのスレッドは接続が生存しているかどうかを1秒に1回確認することができます。それがドロップされた場合は、関数を呼び出すか、変数やその他のものを設定して、アプリケーションが接続が閉じていることを知ることができます。それがなぜ閉鎖されたか(ピア、タイムアウトなどでリセットされた)知っていると、さらに便利になります....

これに関するアドバイスはありますか?このチュートリアルのような

+0

を使用するフローです。 Linuxで 'select()'(または 'epoll()'を使用) – tMC

+0

関連:http://stackoverflow.com/questions/17705239/is-there-a-way-to-detect-that-tcp-socket-has (TL; DR:ソケットから最初に来るすべてのバイトを読み込もうとしない限り、接続が閉じられているかどうかを調べる良い方法はありません。 TCPソケットは、FIFOイベントの順序付けという考え方に基づいているため意図的に実装されています。つまり、到着したデータを順番に読み込み、すべてのストリームを読み込んだ後でストリームの終わりを調べるだけです) –

答えて

13

使用selectはソケットが出力読めるリストにある場合は、あなたがすることができ http://docs.python.org/2/howto/sockets.html#non-blocking-sockets

提案としてクローズツー一定-私たちは、常に取得するよう--、この中にそのソケットのrecvが何かを返すことをビジネスにする。書き込み可能なリストにも同じ考えがあります。あなたは何かを送ることができるでしょう。多分、あなたがほしいと思うすべてではないかもしれませんが、何かが何よりも優れています。 (実際には、合理的に健全なソケットは書き込み可能なものとして返されます。つまり、送信ネットワークのバッファ領域が利用可能であることを意味します)。

...これらの入力リストのどこかが致命的な死亡を犯した場合、失敗します。

これは、私は通常のPosixに

import select 
import socket 

ip = '127.0.0.1' 
port = 80 

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
conn.connect((ip, port)) 

while True: 
    try: 
     ready_to_read, ready_to_write, in_error = \ 
      select.select([conn,], [conn,], [], 5) 
    except select.error: 
     conn.shutdown(2) # 0 = done receiving, 1 = done sending, 2 = both 
     conn.close() 
     # connection error event here, maybe reconnect 
     print 'connection error' 
     break 
    if len(ready_to_read) > 0: 
     recv = conn.recv(2048) 
     # do stuff with received data 
     print 'received:', recv 
    if len(ready_to_write) > 0: 
     # connection established, send some stuff 
     conn.send('some stuff') 
関連する問題