2012-03-19 13 views
2

私は現在、ネットワークに関する基本的なチュートリアルを試行していますが、すべてのデータがクライアントからより多くのデータを読み込もうとすると、クライアント/サーバプログラムがフリーズすることに気付きました受け取った。基本的にこのコードは次のようになります。recvメソッドのpython TCPソケットブロック

def recv_all(sock,length): 
    data='' 
    while len(data)<length: 
     more=sock.recv(length-len(data)) 
     if not more : 
      raise EOFError('socket inchis %d octeti intr-un mesaj de %d octeti'%(len(data),length)) 
     data+=more 
    return data 

この関数は、クライアントとサーバーの両方から呼び出されますが、サーバーはまずクライアント要求を処理するためにこの関数を使用します。リクエストメッセージが受信されたときに、sock.recvへの2回目の呼び出しまですべてうまく行きます。

次の行にジャンプする代わりに(より多くの0を持つ)、デバッガはただそこでフリーズし、私はその理由が何であるか分かりません。

これは何らかの形で関連がある場合、私のOSはWindows XPです。任意の助けがありがとう、 ありがとう

+1

ソケットはブロックされていませんか? –

+2

これは、ソケットがどのように機能するかのように、デフォルトではブロックされます。 'select'を使って、ソケットに読み込むデータがあるかどうかをチェックしたり、ノンブロッキングIOを使うことができます。 – cha0site

+1

私はrecv(1024)を呼び出すと実際に何が起こり、正確に1024バイトが読み込まれるのでしょうか?それ以上のデータがあるかどうかを知る方法はありませんか? –

答えて

3

他の人が指摘したように、原因は、ソケットがデフォルトでブロックされているという事実です。つまり、一部のデータが到着するまで、recv関数はプログラムの実行をブロックします。状況が変更されない限り、プログラムは永遠に、またはサーバーが接続を切断するまで待機します。

sock.settimeout(2)のようなsettimeout関数を使用して、非ブロッキングソケットに切り替える方法が1つあります。つまり、2秒以内に何も受信されなければ、例外がスローされます。あなたはその例外をキャッチし、それに応じて処理することができます。

関連する問題