Bloques de socket TCP de Python en el método recv

Actualmente estoy tratando de pasar por un tutorial básico sobre redes y noté que un progtwig cliente / servidor rudimentario se congelaría en el servidor que intentaba leer más datos del cliente cuando se reciben todos los datos. Básicamente el código se ve así:

def recv_all(sock,length): data='' while len(data)<length: more=sock.recv(length-len(data)) if not more : raise EOFError('socket inchis %d octeti intr-un mesaj de %d octeti'%(len(data),length)) data+=more return data 

Esta función se llama desde el cliente y el servidor, pero el servidor la utilizará primero para procesar la solicitud del cliente. Todo va bien hasta la segunda llamada a sock.recv, cuando se ha recibido el mensaje de solicitud.

En lugar de saltar a la siguiente línea (con más ser 0), el depurador simplemente se congela allí y no tengo idea de cuál podría ser la razón.

Mi sistema operativo es Windows XP si esto es relevante de alguna manera. Cualquier ayuda será apreciada, gracias

Como han señalado otros, la causa es el hecho de que los sockets están bloqueados de forma predeterminada. Esto significa que la función recv bloqueará la ejecución del progtwig hasta que lleguen algunos datos. A menos que se cambien las cosas, el progtwig esperará por siempre o hasta que el servidor interrumpa la conexión.

Una solución es cambiar a sockets no bloqueantes, utilizando la función settimeout , como esta sock.settimeout(2) . Esto significa que si no se recibe nada en 2 segundos, se lanzará una excepción. Puede capturar esa excepción y manejarla en consecuencia.