Unix: si SO_LINGER está apagado, ¿se garantiza que los mensajes no enviados se entregarán antes del cierre del socket? ¿Hay alguna desventaja de habilitar so_linger?

En el caso predeterminado, al close() la pila de red intenta cerrar la conexión con gracia después de asegurarse de que se envían todos los datos, pero esto ocurre de forma asíncrona , en segundo plano , y la llamada a close() regresará sin garantizar que este cierre se haya completado.

El caso SO_LINGER es, por supuesto, diferente. Tiene dos modos de operación: cuando l_linger es cero y cuando no es cero. Cuando es cero, close() aún regresa de inmediato, pero los datos no enviados se descartan y (para protocolos orientados a la conexión) la conexión se restablece (por ejemplo, se envía un RST en el caso de TCP). Cuando no es cero, close() comporta sincrónicamente y bloquea hasta que transcurra el tiempo especificado por l_linger , en cuyo punto el comportamiento es como en el caso cero de l_linger .

Puedo ver muchas opciones de diseño que sugerirían que debería o no usar SO_LINGER , pero si ese comportamiento es deseable para su aplicación, no los clasificaría como “inconvenientes”.