2012-07-25 161 views
6
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',我不知道为什么?非阻塞套接字,错误总是

+0

添加所有代码,包括设置套接字以及您正在运行的Python版本和操作系统。 – StefanE 2012-07-25 10:41:48

+1

仅供参考:'os.strerror(e.args [0])'会输出错误字符串。 – Alex 2015-10-21 08:40:31

回答

9

该套接字是非阻塞的,所以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模块通常是要走的路。

+0

谢谢。我发现问题是我想'time.sleep(1)'。没有它的打印都是''EWOULDBLOCK''。那么为什么'没有紧密循环'是必不可少的? – zhenyuyang 2012-07-25 13:04:26

+0

@zhenyuyang我不明白'我错过了',但紧密的循环只是浪费了CPU周期,当它可以做其他事情时,比如运行其他线程或进程。如果你不断收到EWOULDBLOCK,那么没有数据要读取。如果你不想这种情况,你为什么要使用非阻塞模式? – EJP 2012-07-26 02:21:34

+0

'socket.timeout'异常是否在这里重要? – CMCDragonkai 2016-10-27 20:07:09

3

由设计引发的例外,因为您正在使用non-blocking IO

主要的机械差异是发送,接收,连接和接受可以返回没有做任何事情。你有(当然)有很多选择。你可以检查返回代码和错误代码,通常让自己疯狂。

Python doc

引用如果您运行man errno 3,你将看到的EWOULDBLOCK描述。这个例外是合理的,因为还没有数据可读。