2012-07-25 14 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 

tutto il codice di cui sopra è in un loop.using non-blocking socket (vogliono solo per testare 'non-blocking presa') per ottenere i dati. Ma stampa sempre 'EWOULDBLOCK', non so perché?non bloccante presa, l'errore è sempre

+0

Aggiungi tutto il codice compreso l'impostazione del socket e quale versione di Python e sistema operativo in esecuzione. – StefanE

+1

Per riferimento: 'os.strerror (e.args [0])' stamperà la stringa di errore. – Alex

risposta

9

Il socket non è bloccante, pertanto recv() genererà un'eccezione se non ci sono dati da leggere. Si noti che errno.EWOULDBLOCK = errno.EAGAIN = 11. Questo è il modo in cui Python (e meglio il sistema operativo) in realtà ti dice di provare lo recv() più tardi.

Ho notato che chiudi il socket ogni volta che ottieni questa eccezione. Questo non aiuterà affatto. Il codice dovrebbe essere qualcosa di simile:

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 

Per questo genere di cose, il modulo select di solito è la strada da percorrere.

+0

thanks.Il problema è che mi manca 'time.sleep (1)'. Senza la stampa è tutto '' EWOULDBLOCK '', quindi perché 'no tight loops' è indispensabile? – zhenyuyang

+0

@zhenyuyang Non capisco ' Mi manca ", ma i loop stretti sprecano i cicli della CPU quando potrebbe fare qualcos'altro, come l'esecuzione di altri thread o processi. Se continui a ricevere EWOULDBLOCK non ci sono dati da leggere. Se non vuoi quella condizione, perché stai usando la modalità non bloccante? – EJP

+0

L'eccezione 'socket.timeout' è importante qui? – CMCDragonkai

3

L'eccezione viene sollevata in base alla progettazione, poiché si utilizza non-blocking IO.

La principale differenza meccanica è che l'invio, la ricezione, la connessione e l'accettazione possono tornare senza aver fatto nulla. Hai (ovviamente) un numero di scelte. È possibile controllare il codice di ritorno e i codici di errore e in generale impazzire.

Citato da Python doc

Se si esegue man errno 3, si deve vedere la descrizione di EWOULDBLOCK. L'eccezione è ragionevole, perché non ci sono ancora dati da leggere.