2017-07-11 6 views
0

他の場所では見つけられなかったPythonのソケットモジュールに問題があります。Pythonソケットはタイムアウトしません

私はシンプルなTCPチャットクライアントを構築していますが、最初にサーバに正常に接続すると、タイムアウトの長さを明示的に設定しても、スクリプトは無限にsock.recv()にハングします。

異なるタイムアウト値を使用して、setblocking(False)を含めて試しましたが、私が何をしても、ソケットがブロックモードになっているように動作します。ここで

私のコードの関連部分です:任意の提案は参考になる

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.settimeout(1) 

def listen_to_server(): 
    global connected 

    while connected: 
     ready_to_read, ready_to_write, in_error = select.select([sock], [], []) 

     if ready_to_read: 
      try: 
       data = sock.recv(1024) 
      except socket.timeout: 
       print('TIMEOUT') 
      if not data: 
       append_to_log('Disconnected from server.\n') 
       connected = False 
      else: 
       append_to_log(str(data)) 

、私はここで全損でね。

+0

タイムアウトが効かない理由はわかりませんが、最初のif文は次のようにする必要があります:ready_to_readのソケットがある場合: –

+0

'socket.bind()'は呼び出されません。いくつかのポイント? – Dziugas

+0

また、 'timeout'を使用している場合、ソケットはブロックモードになっているはずです。 – Dziugas

答えて

2

socket timeoutselectの2つのものを混在させました。

あなたがsocket timeoutを設定した場合、あなたはそのソケットに言っている:私はいくつかの操作(例えばrecv())を行う試してみて、自分の限界が、その後タイムアウト例外を発生させるまでには終了しない場合。

selectはファイルディスクリプタ(Windowsのみのソケット)を受け取り、rlist(最初のパラメータ)に読み込み準備の整ったソケットがあるかどうかのチェックを開始します。データが到着した場合、プログラムは続行されます。

今、あなたのコードは次の操作を行います。(あなたは、彼らが到着したことはありませんし、それらを送信しない場合)、ソケット操作のための

  1. セットタイムアウト
  2. 選択は、データを待って開始

、それはですそれ。あなたは選択に立ち往生した。

recv()を選択せず​​に電話するだけです。タイムアウトを適用する必要があります。

複数のソケットを一度に管理する必要がある場合は、selectを使用し、4番目のパラメータのタイムアウトを設定する必要があります。

+0

それはトリックをしました、ありがとう! – jehozm

関連する問題