2011-08-24 7 views
32

Da test, ho concluso che nel seguire tre casi verrà restituito il socket.recv(recv_size).Quando restituisce socket.recv (recv_size)?

  1. Dopo la connessione è stata chiusa. Ad esempio, il lato client chiamato socket.close() o qualsiasi errore di socket si è verificato, restituirà stringa vuota .

  2. Alcuni dati, la dimensione dei dati è superiore a recv_size.

  3. Alcuni dati arrivano, la dimensione dei dati è inferiore a recv_size e non più dati vengono dopo un breve periodo di tempo (ho trovato 0.1s avrebbe funzionato).

Maggiori informazioni su # 3:

#server.py 

while True: 
    data = sock.recv(10) 
    print data, 'EOF' 

#client1.py 

sock.sendall("12345") 
sock.sendall("a" * 50) 

#client2.py 

sock.sendall("12345") 
time.sleep(0.1) 
sock.sendall("a" * 50) 

Quando eseguo client1.py, i server.py Echos:

12345aaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaa EOF 

Quando eseguo client2.py, i server.py Echos:

12345 EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 
aaaaaaaaaa EOF 

Le mie conclusioni sono corrette? Dove posso vedere la descrizione ufficiale sulla # 3?

+0

http://docs.python.org/library/socket.html#socket.socket.recv – mouad

+7

Grazie, ma il manuale non ha risposto alla mia domanda. – redice

+3

Che ne dici qui: http://linux.die.net/man/2/recv – mouad

risposta

18

Sì, la conclusione è corretta. socket.recv è una chiamata bloccante.

socket.recv(1024) leggerà al massimo 1024 byte, bloccando se nessun dato è in attesa di essere letto. Se non si leggono tutti i dati, un'altra chiamata a socket.recv non verrà bloccata.

socket.recv terminerà anche con una stringa vuota se la connessione è chiusa o si verifica un errore.

Se si desidera un socket non bloccante, è possibile utilizzare il modulo di selezione (un po 'più complicato dell'utilizzo di socket) oppure è possibile utilizzare socket.setblocking.

Ho avuto problemi con lo socket.setblocking in passato, ma sentitevi liberi di provarlo se volete.

+0

Non ho visto alcuna descrizione ufficiale sulla mia conclusione 3). – redice

+0

socket.recv leggerà ciò che è pronto per essere letto quando viene effettuata la chiamata a recv. Non importa se la quantità letta è inferiore alla dimensione massima, il socket si sbloccherà non appena può leggere i dati. – Martin

+1

È anche possibile chiamare recv() come non bloccante se si fornisce il flag corretto per questo: 'socket.recv (10240, 0x40) # 0x40 = MSG_DONTWAIT aka O_NONBLOCK' Si noti che è necessario prendere il ' [Errno 11 ] Risorsa temporaneamente non disponibile' eccezioni quando non ci sono dati di input. – Ray

4

Avrà lo stesso comportamento della chiamata di recv libc sottostante vedere lo man page per una descrizione ufficiale del comportamento (o leggere un altro general description di zoccoli socket).

Problemi correlati