redes - sockaddr_in
Usando SO_REUSEADDR-¿Qué sucede con el socket abierto anteriormente? (2)
En la programación de red en Unix, siempre configuré la opción SO_REUSEADDR en el socket que usa el servidor para escuchar las conexiones. Esto básicamente dice que se puede abrir otro socket en el mismo puerto de la máquina. Esto es útil cuando se recupera de un bloqueo y el socket no se cerró correctamente: la aplicación se puede reiniciar y simplemente abrirá otra toma en el mismo puerto y continuará escuchando.
Mi pregunta es, ¿qué pasa con el viejo zócalo? Sin duda, todos los datos / conexiones se recibirán en el antiguo socket. ¿Se cierra automáticamente por el sistema operativo?
Sí, el sistema operativo cierra automáticamente el socket anterior cuando finaliza el proceso anterior. La razón por la que normalmente no puede escuchar en el mismo puerto de inmediato es porque el socket, aunque está cerrado, permanece en el estado 2MSL durante algún tiempo (generalmente unos minutos). El sistema operativo automáticamente transiciona el socket anterior de este estado cuando expira el tiempo de espera.
Un socket se considera cerrado cuando el programa que lo estaba usando se muere. Eso es manejado por el sistema operativo, y el sistema operativo se negará a aceptar cualquier otra comunicación de la conversación muerta. Sin embargo, si el socket se cerró inesperadamente, la computadora en el otro extremo podría no saber que la conversación terminó, y aún puede estar intentando comunicarse.
Es por eso que hay, diseñado en la especificación TCP, un período de espera antes de que ese mismo número de puerto pueda reutilizarse. Porque, en teoría, aunque poco probable, es posible que un paquete de la conversación anterior llegue con la dirección IP, los números de puerto y los números de secuencia apropiados, de forma tal que el servidor receptor los inserte por equivocación en el flujo TCP incorrecto.
La opción SO_REUSEADDR
anula ese comportamiento, lo que le permite reutilizar el puerto de inmediato. Efectivamente, usted está diciendo: "Entiendo los riesgos y me gustaría utilizar el puerto de todos modos".