socket.error errno.EWOULDBLOCK
i'm reading some code and i'v开发者_运维问答e come across this line
socket.error errno.EWOULDBLOCK
can anyone tell me what the conditions have to be to raise this error?
From Python's socket module: http://docs.python.org/library/socket.html
Initially all sockets are in blocking mode. In non-blocking mode, if a recv() call doesn’t find any data, or if a send() call can’t immediately dispose of the data, a error exception is raised.
The error exception it's referring to is errno.EWOULDBLOCK
For this to happen, the socket object must be set to non-blocking mode using: socketObj.setblocking(0)
Note that EWOULDBLOCK is error number 11:
In [80]: import errno
In [83]: errno.EWOULDBLOCK
Out[84]: 11
And the associated error message is:
In [86]: import os
In [87]: os.strerror(errno.EWOULDBLOCK)
Out[89]: 'Resource temporarily unavailable'
Here is some toy code which exhibits the EWOULDBLOCK error.
It sets up a server and client which try to talk to each other over a socket connection. When s.setblocking(0)
is called to put the socket in non-blocking mode, a subsequent call to s.recv
raises the socket.error
. I think this happens because both ends of the connection are trying to receive data:
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()
If s.setblocking(0)
is commented-out, you should see
Received 'Hello, world'
精彩评论