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

以上所有代码都在一个循环中。使用non-blocking socket(只想测试“非阻塞套接字”)来获取数据。但总是打印'EWOULDBLOCK',我不知道为什么?

4

2 回答 2

15

套接字是非阻塞的,因此recv()如果没有要读取的数据会引发异常。请注意,errno.EWOULDBLOCK = errno.EAGAIN = 11。这是 Python(实际上是操作系统)告诉您稍后再试的方式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.

主要的机械区别是 send、recv、connect 和 accept 可以在不执行任何操作的情况下返回。你(当然)有很多选择。您可以检查返回码和错误码,通常会让自己发疯。

引用自Python 文档

如果你运行man errno 3,你会看到描述EWOULDBLOCK。例外是合理的,因为还没有要读取的数据。

于 2012-07-25T11:52:14.663 回答