Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
673 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Verification avant envoi send()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Verification avant envoi send()

n°1397742
zapan25
Posté le 30-06-2006 à 09:53:56  profilanswer
 

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
mood
Publicité
Posté le 30-06-2006 à 09:53:56  profilanswer
 

n°1397852
Taz
bisounours-codeur
Posté le 30-06-2006 à 11:19:08  profilanswer
 

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 ...

n°1397858
zapan25
Posté le 30-06-2006 à 11:22:24  profilanswer
 

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.

n°1397870
zapan25
Posté le 30-06-2006 à 11:37:19  profilanswer
 

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
n°1397887
zapan25
Posté le 30-06-2006 à 11:46:26  profilanswer
 

Emmanuel Delahaye a écrit :

Je ne vois pas de send()...


Je l'ai rajouter.

n°1398029
Taz
bisounours-codeur
Posté le 30-06-2006 à 14:10:47  profilanswer
 

et le retour de select ?

n°1398031
hugo25
Posté le 30-06-2006 à 14:12:53  profilanswer
 

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

n°1398256
Taz
bisounours-codeur
Posté le 30-06-2006 à 17:47:35  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Verification avant envoi send()

 

Sujets relatifs
Socket, recv, send et select qui ne marche pasC# Socket LocalEndPoint : spécifier un port d'envoi (coté client)
Envoi Mail html avec inline imageProblème affichage données par extraction MySQL après vérification mdp
redirection après envoi de donnéesEnvoi d'un formulaire-email dans des includes
probleme envoi mail avec php[VBscript] Envoi de mail
Quel langage pour site avec envoi de donnée dans une BDD ?re re re batch envoi de mail via outlook ??
Plus de sujets relatifs à : Verification avant envoi send()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR