10
sock.setblocking(0)
try:
    data = sock.recv(1024)
 except socket.error, e:
    if e.args[0] == errno.EWOULDBLOCK: 
          print 'EWOULDBLOCK'
else:            
   if not data:   #recv over
      sock.close()
      print 'close================='       
   else:
      print 'recv ---data---------'
      poem += data

上記のコードはすべて loop.using non-blocking socket(「ノンブロッキング ソケット」をテストしたいだけ) でデータを取得します。しかし、常に「EWOULDBLOCK」を出力します。理由はわかりません。

4

2 に答える 2

15

ソケットは非ブロッキングであるためrecv()、読み取るデータがない場合は例外が発生します。errno.EWOULDBLOCK = errno.EAGAIN = 11 であることに注意してください。これは、Python の (実際には OS による)recv()後で再試行するように指示する方法です。

この例外が発生するたびにソケットを閉じることに注意してください。それはまったく役に立ちません。コードは次のようになります。

import socket, errno, time

sock = socket.socket()
sock.connect(('hostname', 1234))
sock.setblocking(0)

while True:
    try:
        data = sock.recv(1024)
        if not data:
            print "connection closed"
            sock.close()
            break
        else:
            print "Received %d bytes: '%s'" % (len(data), data)
    except socket.error, e:
        if e.args[0] == errno.EWOULDBLOCK: 
            print 'EWOULDBLOCK'
            time.sleep(1)           # short delay, no tight loops
        else:
            print e
            break

この種の場合、select通常はモジュールが最適です。

于 2012-07-25T12:10:01.467 に答える
3

例外は設計により発生します。これは、を使用しているためですnon-blocking IO

主な機械的な違いは、送信、受信、接続、および受け入れは、何もしなくても戻ることができることです。(もちろん)いくつかの選択肢があります。リターンコードとエラーコードを確認して、一般的に自分を夢中にさせることができます。

Pythonドキュメントから引用

を実行するman errno 3と、の説明が表示されEWOULDBLOCKます。まだ読み取るデータがないため、例外は妥当です。

于 2012-07-25T11:52:14.663 に答える