Python 非阻塞套接字,错误总是
以上所有代码都在一个循环中。使用Python 非阻塞套接字,错误总是,python,sockets,Python,Sockets,以上所有代码都在一个循环中。使用非阻塞套接字(只想测试“非阻塞套接字”)获取数据。但总是打印“EWOULDBLOCK”,我不知道为什么 异常是由设计引发的,因为您使用的是非阻塞IO 主要的机械差异是发送、接收、连接和接受可以在不做任何事情的情况下返回。你(当然)有很多选择。你可以检查返回码和错误码,这通常会让你发疯 引自 如果运行man errno 3,您将看到eWoldBlock的说明。这个例外是合理的,因为还没有数据可以读取 套接字是非阻塞的,因此如果没有可读取的数据,recv()将引发异常
非阻塞套接字
(只想测试“非阻塞套接字”)获取数据。但总是打印“EWOULDBLOCK”,我不知道为什么 异常是由设计引发的,因为您使用的是非阻塞IO
主要的机械差异是发送、接收、连接和接受可以在不做任何事情的情况下返回。你(当然)有很多选择。你可以检查返回码和错误码,这通常会让你发疯
引自
如果运行
man errno 3
,您将看到eWoldBlock
的说明。这个例外是合理的,因为还没有数据可以读取 套接字是非阻塞的,因此如果没有可读取的数据,recv()
将引发异常。请注意,errno.ewoldblock=errno.EAGAIN=11。这是Python(实际上是操作系统)告诉您稍后再尝试recv()
的方式
我注意到,每次出现此异常时,都会关闭套接字。那根本没用。您的代码应该是这样的:
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
对于这类事情,模块通常是最好的选择。添加所有代码,包括设置套接字以及运行的Python版本和操作系统。作为参考:
OS.strerror(e.args[0])
将打印错误字符串。谢谢。我发现问题是我错过了时间。睡眠(1)
。没有它,打印的都是“EWOULDBLOCK”。那么为什么“没有紧循环”是必不可少的呢?@zhenyuyang我不理解“我错过了”,但紧循环只是浪费了CPU周期,因为它可以做其他事情,比如运行其他线程或进程。如果您一直在获取EWoldblock,则没有数据可读取。如果您不想出现这种情况,为什么要使用非阻塞模式?socket.timeout
异常在这里重要吗?@cmcdragokai:不,不会发生超时异常,因为socket是非阻塞的。如果需要超时,请使用socket.settimeout()
,然后处理任何socket.timeout
异常。或者,通常更好的方法是使用select()/poll()
来监视套接字。socket.timeout
是否也与特定的errno.?
,如果您想用socket.error
异常处理程序捕获它?
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