Bon le titre est un peu fourre-tout mais bon...
Voilà j'ai fait un programme client/serveur, je gère les connexions tout ça, jusque là aucun problèmes.
Maintenant j'aimerais géré un système de timeout de connexion mais assez particulier. J'explique : mon applis serveur ne sert qu'a prendre en compte les clients qui souhaitent se connecter. Il y a vérification du paquet (ses données doivent contenir un chtit truc qui leur permet d'avoir une session...enfin bref là n'est pas la question) et si c'est bon l'appli serveur lance un processus fils qui, lui va géré exclusivement ce nouveau client sur un port TCP qu'il va ouvrir à cet effet (il contact le client, lui dit "youh ouh tu peus te connecter là" et c parti pour le blabla entre eux).
Donc l'appli serveur principale laisse à la charge du proc fils de géré le dialogue proprement dis avec le client...
Maintenant j'aimerais avoir un système de ping de présence entre le client et le proc fils qui lui a été aloué...genre toutes les 50 secondes le client envois un paquet de présence au proc fils sur le serveur. Bon jusque là c'est pas difficile. Mais au niveau proc fils serveur moi je veux pas faire un read non-bloquant (forcément). Donc je me dis hop un ptit sleep avant de 50 secondes, alors après une fois dans le read ben le paquet aura eu le temps d'arriver et si c pas le cas bon on ferme la connexion.
Bon ok j'aurais pu géré ça avec select mais ça m'interesse pas (en effet là je n'ai qu'un descipteur dans mon cas et utiliser select serait bcp trop lourd si je devais en mettre un dans chaque proc fils...vu le peu de descripteurs à gérer enfin passons). Et je sais qu'on peu faire autrement.
Bon maintenant le problème c'est de synchroniser le client et le proc fils serveur... Vous feriez quoi vous? parce qu'imaginez que le proc fils commence son sleep...30 secondes plus tard c'est à ce moment là que le client se décide à envoyer son paquet de présence. Bon le réseau est bon il arrive à bon port au bout de 5 secondes ok (euh un reseau bon avec un ping de 5 secondes? lol). Mais si il met 30secondes à arriver? le sleep se termine, le read non bloquant renvois 0...terminé la connexion est fermée.
Bon c'est un peu tiré par le cheuveux mon truc et si j'ai pris des secondes au lieu de millisecondes c'était pour parler en temps humain
voilà voilà, c'est un peu conceptuel comme discours je vous l'accorde mais je pense pas qu'il y ait besoin de code pour illustrer mes propos.
Donc en résumé :
- comment géré un timeout fiable sur une socket sans select()?
- comment synchroniser les départ du client et du proc-fils pour les paquets de présence? (afin d'éviter au maximum un décalage temporel entre eux, si j'ai un décalage d'1 ou 2 sec c pas grave)
Partager