En cuanto al primer ejemplo, me parece correcto, el único detalle que la condición del while creo que es err == "" && !linea.contain("\n\n") y la condición del if error != "" como puso Sergio en https://eva.fing.edu.uy/mod/forum/discuss.php?d=132166#p308374
Por defecto se asume para TCP la recepción es bloqueante:
"...Los modos bloqueante o no bloquenate se aplican a las operaciones de lectura, escritura y accept. Por defecto los sockets se crean como bloqueantes."
(página 2 de la cartilla)
Adjunté dos ejemplos (cliente y servidor TCP) en un comprimido, son muy similares a los que subieron los profesores pero en Python. Por ahí ayuda para entender mejor, el uso es bastante parecido a los definidos en la cartilla.