Détecter la fermerture d'une socket sans lire les données en attente

J’ai récemment été confronté à la problématique de devoir détecter (dans une application C sous Linux) si une socket employée avait été fermée sans être obligé de lire les données en attente dans celle-ci.

Il n’existe (à ma connaissance) aucun moyen portable de réaliser cela. Mais Linux offre (via l’appel getsockopt) la possibilité de consulter la structure tcp_info du noyau (voir /usr/include/linux/tcp.h). Voici comment le test a été réalisé:

struct tcp_info info;
socklen_t len = sizeof(info);
if (getsockopt(remote_s, SOL_TCP, TCP_INFO, &info, &len) != -1) {
    if (info.tcpi_state == TCP_CLOSE ||
        info.tcpi_state == TCP_CLOSE_WAIT ||
        info.tcpi_state == TCP_CLOSING) {
                [... do what you want here ...]
    }
}

Additional Resources

Découvrez le « Debian Administrator's Handbook »

Book coverAprès une campage de libération réussie, la traduction anglaise du Cahier de l'Admin Debian est désormais librement disponible. Si vous appréciez mes articles et ce que je fais pour Debian, je vous invite à le parcourir et à en obtenir une copie.