Sur mon serveur, je vérifie si un socket est prêt à être lu en utilisant select()
pour le déterminer. En conséquence, dans la boucle principale, select()
est exécuté à chaque itération.
Pour tester le serveur, j'ai écrit un client simple qui envoie un seul message puis se ferme. Au fait, j'utilise des protocoles protobuf pour envoyer des informations - message signifie un objet de type classe Message dans cette bibliothèque.
La session de test ressemble à ceci :
select()
- socket du serveur prêt à être lu
accept()
le socket du client- lire le message du socket du client
select()
- socket du serveur pas prêt à être lu, celui du client prêt
- lire le message du socket du client
La dernière étape est incorrecte car le client a déjà fermé la connexion. En conséquence, la bibliothèque protobuf obtient Segmentation fault
. Je me demande pourquoi FD_ISSET indique que le socket est prêt à l'étape 6 lorsqu'il est fermé. Comment puis-je vérifier si un socket est fermé ?
ÉDITER :
J'ai trouvé comment vérifier si le socket est ouvert
int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len );