2012-07-25 19 views
6
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 es en un loop.using non-blocking socket (sólo quieren probar 'no bloqueante socket') para obtener los datos. Pero siempre imprime 'EWOULDBLOCK', no sé por qué?no bloqueando toma, el error es siempre

+0

Agregue todos los códigos incluyendo la configuración del socket y la versión de Python y el sistema operativo en el que se está ejecutando. – StefanE

+1

Para referencia: 'os.strerror (e.args [0])' le imprimirá la cadena de error. – Alex

Respuesta

9

El zócalo no bloquea, 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 manera de Python (bueno, el sistema operativo realmente) de decirle que pruebe el recv() nuevamente más tarde.

Noto que cierra el socket cada vez que obtiene esta excepción. Eso no va a ayudar en absoluto. El 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 select suele ser el camino a seguir.

+0

gracias.Me parece que el problema es que echo de menos 'time.sleep (1)' .without la impresión es todo '' EWOULDBLOCK ''. Entonces, ¿por qué 'no hay lazos apretados' es indispensable? – zhenyuyang

+0

@zhenyuyang No lo entiendo ' Echo de menos, pero los bucles apretados solo desperdician ciclos de CPU cuando podría estar haciendo otra cosa, como ejecutar otros hilos o procesos. Si sigue obteniendo EWOULDBLOCK, no hay datos para leer. Si no quieres esa condición, ¿por qué estás usando el modo sin bloqueo? – EJP

+0

¿Tiene la excepción 'socket.timeout' aquí? – CMCDragonkai

3

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

La principal diferencia mecánica es que enviar, recv, conectar y aceptar puede regresar sin haber hecho nada. Tienes (por supuesto) una serie de opciones. Puede verificar el código de retorno y los códigos de error y, en general, volverse loco.

citado de Python doc

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

Cuestiones relacionadas