Investigamos y leímos que para
detectar si un socket se cerró debemos
utilizar recv y send. El primero devuelve 0 en el caso que el socket se
haya cerrado y el otro -1 con la bandera SIGPIPE encedida. En el caso de que el cliente cierre la
conexión, lo chequeamos en el servidor (que no recibimos datos)
verificando el resultado del send para decidir si cerrar el socket o no.
También vimos que al cerrar "abruptamente" (con Ctrl+C) el servidor, se mandan las dos parejas FIN-ACK como corresponde, y en ese caso no ejecutamos ningún close, lo que nos hace pensar que el sistema se encarga de eso.
Todo esto nos genera las siguientes dudas a nivel de capa de transporte:
¿Ejecutar un close() significa mandar el segmento FIN que da inicio a la finalización? ¿Del lado que recibo el FIN, tengo que específicamente ejecutar otro close() para mandar el par restante de FIN-ACK? ¿O esto se ejecuta en la capa de transporte fuera de nuestro alcance?
¿Si no se ejecuta el close() y se cierra el programa, el FIN se envían igual? ¿Quién lo envía?
Agradecemos si nos despejan estas dudas, gracias.