开发者

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'
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜