zócalo no bloqueante, el error es siempre

sock.setblocking(0) try: data = sock.recv(1024) except socket.error, e: if e.args[0] == errno.EWOULDBLOCK: print 'EWOULDBLOCK' else: if not data: #recv over sock.close() print 'close=================' else: print 'recv ---data---------' poem += data 

Todo el código anterior está en un bucle. Usando un socket non-blocking socket (solo quiero probar ‘socket no bloqueante’) para obtener datos. Pero siempre imprima ‘EWOULDBLOCK’, no sé por qué?

El socket no está bloqueando, por lo que recv() generará una excepción si no hay datos para leer. Tenga en cuenta que errno.EWOULDBLOCK = errno.EAGAIN = 11. Esta es la forma de Python (bueno, el sistema operativo en realidad) de decirle que intente recv() nuevamente más tarde.

Observo que cierras el zócalo cada vez que obtienes esta excepción. Eso no va a ayudar en absoluto. Su código debe ser algo como esto:

 import socket, errno, time sock = socket.socket() sock.connect(('hostname', 1234)) sock.setblocking(0) while True: try: data = sock.recv(1024) if not data: print "connection closed" sock.close() break else: print "Received %d bytes: '%s'" % (len(data), data) except socket.error, e: if e.args[0] == errno.EWOULDBLOCK: print 'EWOULDBLOCK' time.sleep(1) # short delay, no tight loops else: print e break 

Para este tipo de cosas, el módulo de select suele ser el camino a seguir.

La excepción se produce por diseño, porque está utilizando non-blocking IO .

La principal diferencia mecánica es que el envío, la recepción, la conexión y la aceptación pueden devolverse sin haber hecho nada. Usted tiene (por supuesto) una serie de opciones. Puedes verificar el código de retorno y los códigos de error y, en general, volverte loco.

Citado de Python Doc.

Si ejecuta man errno 3 , verá la descripción de EWOULDBLOCK . La excepción es razonable, porque todavía no hay datos para leer.