我正在读一些代码而且我遇到过这一行
socket.error errno.EWOULDBLOCK
有谁能告诉我提出这个错误的条件是什么?
答案 0 :(得分:3)
来自Python的套接字模块:http://docs.python.org/library/socket.html
最初所有套接字都处于阻塞状态 模式。在非阻塞模式下,如果是 recv()调用找不到任何数据,或 如果send()调用不能立即 处理数据,错误异常 被提出。
它引用的错误异常是errno.EWOULDBLOCK
为此,必须使用以下命令将套接字对象设置为非阻塞模式:socketObj.setblocking(0)
答案 1 :(得分:3)
请注意,EWOULDBLOCK是错误编号11:
In [80]: import errno
In [83]: errno.EWOULDBLOCK
Out[84]: 11
相关的错误消息是:
In [86]: import os
In [87]: os.strerror(errno.EWOULDBLOCK)
Out[89]: 'Resource temporarily unavailable'
这是一些展示EWOULDBLOCK错误的玩具代码。
它设置了一个服务器和客户端,它们试图通过套接字连接相互通信。当调用s.setblocking(0)
将套接字置于非阻塞模式时,后续调用s.recv
会引发socket.error
。我认为这是因为连接的两端都试图接收数据:
import socket
import multiprocessing as mp
import sys
import time
def server():
HOST='localhost'
PORT=6000
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr=s.accept()
while True:
data=conn.recv(1024)
if data:
conn.send(data)
conn.close()
def client():
HOST='localhost'
PORT=6000
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.setblocking(0) # Comment this out, and the EWOULDBLOCK error goes away
s.send('Hello, world')
try:
data=s.recv(1024)
except socket.error as err:
print(err)
# [Errno 11] Resource temporarily unavailable
sys.exit()
finally:
s.close()
print('Received {0}'.format(repr(data)))
def run():
server_process=mp.Process(target=server)
server_process.daemon=True
server_process.start()
time.sleep(0.1)
client()
run()
如果s.setblocking(0)
已注释掉,您应该看到
Received 'Hello, world'