2010-09-05 13 views
0

Je lis un peu de code et je suis tombé sur cette lignesocket.error errno.EWOULDBLOCK

socket.error errno.EWOULDBLOCK 

quelqu'un peut me dire ce que les conditions doivent être de soulever cette erreur?

Répondre

3

Du module de prise de Python: http://docs.python.org/library/socket.html

Dans un premier temps toutes les prises sont en bloquant le mode . En mode non bloquant, si un appel recv() ne trouve aucune donnée, ou si un appel send() ne peut pas immédiatement disposer des données, une erreur est levée.

L'exception d'erreur, il fait référence à est errno.EWOULDBLOCK

Pour que cela se produise, l'objet socket doit être réglé sur le mode non-bloquant à l'aide: socketObj.setblocking(0)

2

Notez que EWOULDBLOCK est le numéro d'erreur 11 :

In [80]: import errno 
In [83]: errno.EWOULDBLOCK 
Out[84]: 11 

Et le message d'erreur est associé:

In [86]: import os 
In [87]: os.strerror(errno.EWOULDBLOCK) 
Out[89]: 'Resource temporarily unavailable' 

Voici un code jouet qui présente l'erreur EWOULDBLOCK. Il configure un serveur et un client qui tentent de se parler via une connexion socket. Lorsque s.setblocking(0) est appelé pour mettre le socket en mode non bloquant, un appel ultérieur à s.recv déclenche le socket.error. Je pense que cela se produit parce que les deux extrémités de la connexion tentent de recevoir des données:

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() 

Si s.setblocking(0) est en commentaire, vous devriez voir

Received 'Hello, world'