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 ...] } }