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?
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?
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)
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'