非阻塞套接字,总是出错

时间:2012-07-25 09:48:46

标签: python sockets

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',我不知道为什么?

2 个答案:

答案 0 :(得分:11)

套接字是非阻塞的,因此如果没有要读取的数据,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模块通常是要走的路。

答案 1 :(得分:3)

设计引发了异常,因为您使用的是non-blocking IO

  

主要的机械差异是send,recv,connect和accept可以在没有做任何事情的情况下返回。你(当然)有很多选择。您可以检查返回代码和错误代码,并且通常会让自己变得疯狂。

引自Python doc

如果您运行man errno 3,您会看到EWOULDBLOCK的说明。这个例外是合理的,因为还没有数据可供阅读。