socket.error errno.EWOULDBLOCK - PullRequest
       16

socket.error errno.EWOULDBLOCK

1 голос
/ 05 сентября 2010

Я читаю какой-то код и наткнулся на эту строку

socket.error errno.EWOULDBLOCK

Может кто-нибудь сказать мне, какие условия должны быть, чтобы вызвать эту ошибку?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2010

Из модуля сокетов Python: http://docs.python.org/library/socket.html

Изначально все розетки находятся в блокировке Режим. В неблокирующем режиме, если вызов recv () не находит никаких данных, или если вызов send () не может быть сразу распоряжаться данными, исключение ошибки поднят .

Исключительная ошибка, на которую она ссылается, - errno.EWOULDBLOCK

Для этого объект сокета должен быть установлен в неблокирующий режим с помощью: socketObj.setblocking(0)

3 голосов
/ 06 сентября 2010

Обратите внимание, что 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'
...