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',我不知道为什么?
答案 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可以在没有做任何事情的情况下返回。你(当然)有很多选择。您可以检查返回代码和错误代码,并且通常会让自己变得疯狂。
如果您运行man errno 3
,您会看到EWOULDBLOCK
的说明。这个例外是合理的,因为还没有数据可供阅读。