timeout [socket] - C++ - Programmation
Marsh Posté le 24-12-2004 à 16:56:14
il faut utiliser la fonction select
voila je te donne une methode qui utilise la fonction select:
Code :
|
Marsh Posté le 24-12-2004 à 19:58:17
ok j'ai compris et j'ai même réussi à mettre la solution en place
A present j'ai un autre pb.
J'ai un connexion qui ne necessite pas qu'il y ai forcement de transfert, on peut etre connecté au serveur sans rien faire.
Seulement si le client se ferme mal le serveur ne sait pas qu'il n'ai plus là.
J'aurais une solution qui serait de pinguer toutes les x minutes les clients.
Le ping se ferait avec l'envoie d'un msg et d'une reponse de la part du client (là il y aurait un timeout)
2 questions:
- Y a t'il un autre moyen de savoir si le client n'est pas deco?
- Y aurait 'il une fonction spéciale pour le ping qui serait mieux que l'envoie d'un simple message?
Marsh Posté le 24-12-2004 à 21:15:44
Le PING ne permet pas de surveiller une connexion TCP. Le PING est du niveau réseau tandis que la connexion TCP est du niveau transport.
SELECT te permet de surveiller les evenements en émission, réception et connexion/déconnexion. Interesses toi à la documentation de cette fonction, tu devrais trouver ce que tu cherches.
Marsh Posté le 24-12-2004 à 23:42:06
quand je parlais de ping c'était une image, je ne pensais pas à la vrai fonction.
Je regarderais avec la fonction select
merci
Marsh Posté le 25-12-2004 à 11:27:19
Essaye peut etre avec le keepalive de TCP : avec setsockopt, active SO_KEEPALIVE. Le probleme c'est que par defaut un message est envoye toutes les deux heures.
Pour changer ca (par ex. 30 secondes) sous windows, il faut ajouter une clef dans la base de registre (http://support.microsoft.com/kb/q102973/)
System Key: [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters]
KeepAliveTime REG_DWORD 0x006DDD00 (30000)
KeepAliveInterval REG_DWORD 0x000003e8 (1000)
et sous Linux il suffit de faire :
echo "30" > /proc/sys/net/ipv4/tcp_keepalive_time
J'ai verifie que ca marchait sur W2K, il ne faut pas oublier de rebooter apres avoir change la registry.
Marsh Posté le 24-12-2004 à 16:46:07
Bonjour,
En ce moment j'écrit une application reseau qui utilise les socket en mode tcp
J'utilise la fonction recv pour recevoir un message
Seulement voila j'ai un petit probleme: lorsque je ne recoit rien.
Il peut arriver que je ne recoivent rien (applis distant qui plante ... ).
Le probleme c'est que je continue à attendre.
Je voudrais donc attendre que un certain temps.
Je ne sais pas vraiment comment faire ... ?