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

Libérez le « Debian Administrator's Handbook »

La campage de libération pour la traduction anglaise du Cahier de l'Admin Debian est en cours. Ce projet compte énormément pour moi, si vous appréciez mes articles et ce que je fais pour Debian, je vous invite à y participer. Voici où nous en sommes :

Cliquez-ici pour participer. Si vous contribuez au moins 10 EUR vous aurez une copie du livre électronique dès sa publication.