-
Etat d'une socket.
Bonjour,
Je cherche à connaitre l'état d'un socket TCP.
Dans mon serveur, je teste avec ioctl(FION_READ) s'il y a des données à traité. Si c'est le cas j'appel receive() sinon j'attend et je recommence. Mon problème est lorsque mon client crash, je ne suis pas capable de le savoir. Donc mon serveur pense qu'il est toujours connecté.
Merci d'éclairer ma lanterne.
PS : Je suis sous linux (une fonction POSIX serait bienvenue).
PS2: Je continue de chercher en attendant.
-
Il n'y a pas.
Il existe une fonction pour prévenir que la connexion est terminée (shutdown()), mais il n'existe pas de fonction pour prévenir que la connexion n'est plus active (et pour cause : comment devenir si la "perte" de connexion est due à un problème intermittent (genre beaucoup de lag parce que le petit frère a décidé que Hadopi étant une loi trop tentante à tester) ou définitif (par ce que le serveur a crashé) ?
C'est encore pire en mode non connecté.
La seule solution est d'essayer de communiquer avec le serveur ; s'il ne renvoie pas d'acknowlegde (que ce soit l'ACK du TCP ou un pseudo-ACK implémenté pour UDP) avant un timeout défini, c'est qu'il est mort et que la connexion doit être restaurée.
-
Bonjour,
Tu peux aussi implémenter une logique de timeOut. Si le client ne communique pas pendant x secondes, tu fermes la connexion. Il faut donc configurer le timeOut sur le select, mais également mettre à jour un timestamp sur réception d'un paquet du client et fermer les connexions trop anciennes.
Il me semble que l'on peut aussi envoyer automatiquement des paquets Keep-Alive sous widows pour notifier la perte d'une connexion, mais je ne sais pas si c'est le cas sous linux.
-
J'avoue que je ne comprend pas bien comment la fonction shutdown() prévient la machine distante et surtout comment récupérer l'information. :roll:
Sinon je suis d'accord avec toi Emmanuel, il n'est pas possible de distinguer un lenteur réseau, d'une déconnexion brutale.
PS: Je me demandai pourquoi il avait une commande PING dans le protocole que je doit implémenter maintenant je sais pourquoi. :aie: