Verification avant envoi send()

Verification avant envoi send() - C - Programmation

Marsh Posté le 30-06-2006 à 09:53:56    

Bonjour,
 
Je réalise un programme client/serveur. Le serveur peut ne plus marcher à tous moments, sans que le client ne la sache.
Lorque je réalise un send() dans le client, celui-ci plante lorsque le serveur tombe. Comment empécher celà ?
 
Merci d'avance.


Message édité par zapan25 le 30-06-2006 à 09:55:12
Reply

Marsh Posté le 30-06-2006 à 09:53:56   

Reply

Marsh Posté le 30-06-2006 à 11:19:08    

faire en sorte que le serveur ne tombe pas ... je vois pas comment send ne peut pas échouer si y a personne au bout du fil ...

Reply

Marsh Posté le 30-06-2006 à 11:22:24    

le serveur est un serveur MySQL, je ne pas le controler. Je ne cherche pas à ne pas faire échouer le send, mais à mieux gérer mon send afin que lorsque le serveur tombe, mon client ne crach pas aussi.

Reply

Marsh Posté le 30-06-2006 à 11:37:19    

mon probléme est le suivant :
Pourquoi ce code :
 

Code :
  1. retval = select(sock+1, &readfds, &writefds, &exceptfds, &timeout);
  2.   if (FD_ISSET(sock,&readfds)) {
  3.     nbRecu = recv(sock, paquet, longueurPaquet, 0);[
  4.   }
  5.   else {
  6.     printf("recvPaquet ERREUR : retval=%d\n",retval);
  7.     return -1;
  8. }


 

Code :
  1. retval = select(sock+1, &readfds, &writefds, &exceptfds, &timeout);
  2.  
  3.   if (FD_ISSET(sock,&writefds)) {
  4.     printf("avant send 2\n" );
  5.     nbRecu = send(sock, paquet, longueurPaquet, 0);
  6.     printf("sendPaquet lg=%d send=%d\n",longueurPaquet,nbRecu);
  7.   }
  8.   else {
  9.     printf("sendPaquet ERREUR : retval=%d\n",retval);
  10.     return -1;
  11.  
  12.   }


ne marche pas ?
 
les fonctions retournent toujours -1.


Message édité par zapan25 le 30-06-2006 à 11:45:54
Reply

Marsh Posté le 30-06-2006 à 11:46:26    

Emmanuel Delahaye a écrit :

Je ne vois pas de send()...


Je l'ai rajouter.

Reply

Marsh Posté le 30-06-2006 à 14:10:47    

et le retour de select ?

Reply

Marsh Posté le 30-06-2006 à 14:12:53    

Taz a écrit :

et le retour de select ?


 
Voilà d'abord la fonction :
 

Code :
  1. int sendPaquet(int sock, char *paquet, int longueurPaquet)
  2. {
  3.   int nbRecu = 0;
  4.   int retval;
  5.   fd_set writefds;
  6.   struct timeval timeout;
  7.   FD_ZERO(&writefds);
  8.   FD_SET(sock, &writefds);
  9.   timeout.tv_sec = TIMEOUT;
  10.   timeout.tv_sec = 10;
  11.   timeout.tv_usec = 0;
  12.   retval = select(sock+1, NULL, &writefds, NULL, &timeout);
  13.  
  14.   if (retval == -1) {
  15.     printf("sendPaquet ERREUR 1\n" );
  16.     return -1;
  17.   }
  18.   if (retval == 0) {
  19.     printf("sendPaquet ERREUR 2\n" );
  20.     return -1;
  21.   }
  22.   else {
  23.     if (FD_ISSET(sock,&writefds)) {
  24.       printf("avant send\n" );
  25.       nbRecu = send(sock, paquet, longueurPaquet, 0);
  26.       printf("sendPaquet lg=%d send=%d\n",longueurPaquet,nbRecu);
  27.       return nbRecu;
  28.     }
  29.     else {
  30.       printf("sendPaquet ERREUR 3 : retval=%d\n",retval);
  31.       return -1;
  32.  
  33.     }
  34.   }
  35. }


 
La fonction fonctionne normalement quand le serveur marche.
 
Voilà le résultat de mon programme qui utilise cette fonction en boucle:
 
=> Le serveur fonctionne
 Nouvelle Iteration
retour requeteMySQL = 0
 
=> Le serveur ne fonctionne plus
 Nouvelle Iteration
avant send
sendPaquet lg=26 send=26
retour=26; longueurPaquet=26
recvPaquet lg=5 recv=0
Erreur 1 lors de la reception du message 'Tabular Response'.
retour requeteMySQL = -1
 
 Nouvelle Iteration
avant send
=> crach
 
Comme on le voit, la fonction en détecte pas que le serveur est mort. C'est le retour de la fonction recv qui fait retourner un code d'erreur faux.
Lors d'une nouvelle itération, mystérieusement le programme crach.
Le retour du select est donc malheureusement toujours différent de -1 et 0

Reply

Marsh Posté le 30-06-2006 à 17:47:35    

recv te fait un 0 parce que la connexion a été fermée. EOF. utilise perror si tu veux savoir le vrai problème pour ton send.
 
mais moi je n'en vois aucun.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed