Cuando se utiliza un socket TCP, lo que haceComportamiento de apagado (calcetín, SHUT_RD) con TCP
shutdown(sock, SHUT_RD);
realmente? ¿Simplemente hace que todas las llamadas recv()
devuelvan un código de error? Si es así, ¿qué código de error?
¿Hace que los paquetes sean enviados por la conexión TCP subyacente? ¿Qué ocurre con los datos que envía el otro lado en este momento? ¿Se conservan y el tamaño de la ventana de la conexión se reduce hasta llegar a 0, o simplemente se descarta, y el tamaño de la ventana no se reduce?
¿por qué SHUT_RD afectaría a los escritores? No veo ninguna razón obvia para hacerlo (aunque supongo que siempre uso MSG_NOSIGNAL, por lo que puede tener un impacto). – Tom
Porque (citando de Wikipedia) "En las plataformas que cumplen con POSIX, SIGPIPE es la señal enviada a un proceso cuando intenta escribir en un conducto sin un proceso conectado al otro extremo". Y la instrucción shutdown (calcetín, SHUT_RD) desconecta el proceso de lectura de la tubería. Para agregar daño por insulto, la acción predeterminada al recibir una señal SIGPIPE es que el proceso (es decir, el escritor) finalice. –
Esto no es correcto. Cualquier lectura adicional hará que recv() vuelva a ejecutar cero, indicando el final del flujo. – EJP