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
以上所有代码都在一个循环中。使用非阻塞套接字
(只是想测试“非阻塞套接字”)来获取数据。但总是打印'EWOULDBLOCK',我不知道为什么?
最佳答案
套接字是非阻塞的,因此如果没有数据可读,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
模块通常是要走的路。
关于python - 非阻塞套接字,错误总是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11647046/