Bonsoir,
Voila, j'ai un code qui se connecte sur un serveur (jusqu'a là normal).
J'aurais juste voulu connaitre un moyen qu'a le client de detecter une éventuelle coupure.
Merci d'avance.
Version imprimable
Bonsoir,
Voila, j'ai un code qui se connecte sur un serveur (jusqu'a là normal).
J'aurais juste voulu connaitre un moyen qu'a le client de detecter une éventuelle coupure.
Merci d'avance.
Tu travailles sur quel système d'exploitation et tu utilises quels outils pour te connecter à ton serveur ?
Si ce sont des sockets sous Unix, read() te renvoie toujours la longueur du paquet lu. Par convention, une longueur nulle est considérée par le lecteur comme une refermeture à l'initiative de l'homologue.
Pour le reste, ça fonctionne comme un tube : si tu essaies d'écrire dedans alors qu'il ne fonctionne plus (pour quelque raison que ce soit), tu reçois un SIGPIPE mettant automatiquement fin à ton programme s'il n'est pas intercepté.
salut
En faite, je suis sous Linux.
En faite, c'est pas en terme de reception, mais en terme d'envoi. J'ai un client, et je voudrais savoir si je suis toujours connecté au serveur (sinon l'envoi fait bloquer le programme).
Merci.
C'est pareil. Le fait que send ou recv (ou read ou write) retourne 0 indique que la connexion a été coupée. Il n'y a pas blocage.
Mon probleme est que "justement" il y a blocage dans mon cas.
Quand on coupe le serveur (volontairement ou non), le client envoi les données (cela retourne le nombre d'octets correspondant), le coup suivant, lorsque le client envoi ses données, il bloque tout simplement.
voici, la partie initialisation de connexion du programme
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 int res; int opt = 1 ; // si sock !=0 alors on a eu un probleme de connexion close(sock); sock = socket(AF_INET, SOCK_STREAM, 0);// declaration du socket if(sock == 0)// On verifie que le socket est ouvert return false; // on arrete tout sinon SOCKADDR_IN socketin ={0}; // on entre les données du serveur. socketin.sin_addr.s_addr = inet_addr(host); // l'adresse Ip socketin.sin_port = htons(port); // le port socketin.sin_family = AF_INET; // le protocole d'ip. res = connect(sock,(SOCKADDR *) &socketin, sizeof(SOCKADDR));// on s'y connecte if(res == SOCKET_ERROR) { close(sock); return false;// si la connexion a echoué... } return true; // la connexion a reussi...
Et si tu spécifiais un timeout sur ton socket (setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, ...)) ? Si un send n'aboutit pas au bout de quelques secondes, c'est assez louche. Là tu peux tester l'état de la connexion (voir si gethostbyname marche par exemple) et agir en conséquence.