Socket, recv, send et select qui ne marche pas

Socket, recv, send et select qui ne marche pas - C - Programmation

Marsh Posté le 29-06-2006 à 10:52:07    

Je réalise une fonction (sous linux) pour améliorer la fonction recv, notamment en gérant les paquet coupé en ethernet et un timeout :

Code :
  1. int recvPaquet(int sock, char *paquet, int longueur)
  2. {
  3.   int nbRecu = 0, nbRecu2 = 1;
  4.   int retval;
  5.   fd_set readfds;
  6.   struct timeval timeout;
  7.   FD_ZERO(&readfds);
  8.   FD_SET(sock, &readfds);
  9.   timeout.tv_sec = TIMEOUT;
  10.   timeout.tv_sec = 1;
  11.   timeout.tv_usec = 0;
  12.   retval = select(sock+1, &readfds, NULL, NULL, &timeout);
  13.   if (retval) {
  14.     nbRecu = recv(sock, paquet, longueur, 0);
  15.     // On gère le cas ou tous les caracteres voulu ne sont pas arrivées
  16.     nbRecu2= nbRecu;
  17.     while ((nbRecu > 0) && (nbRecu != longueur) && (nbRecu2 > 0)) {
  18.       paquet += nbRecu2;
  19.       nbRecu2 = recv(sock, paquet, longueur - nbRecu, 0);
  20.       if (nbRecu2 >= 0) {
  21. nbRecu += nbRecu2;
  22.       }
  23.       else {
  24. nbRecu = nbRecu2;
  25.       }
  26.     }
  27.     return nbRecu;
  28.   }
  29.   else {
  30.     printf("recvPaquet %d\n",retval);
  31.     return -1;
  32.   }
  33. }


 
J'ai fait la même chose pour la fonction send
 

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


 
La fonction recvPaquet marche bien. Les octets sont bien envoyés avec le fonction sendPaquet, mais immédiatement après le serveur coupe la communication. Je ne peux plus envoyer ou recevoir de données au serveur.  
Je voudrais verifier que la communication avec le serveur n'a pas été coupé avant d'envoyer. Ceci afin de rendre le send non bloquant.
Est-ce comme celà que je dois proceder ?


Message édité par hugo25 le 29-06-2006 à 11:07:10
Reply

Marsh Posté le 29-06-2006 à 10:52:07   

Reply

Sujets relatifs:

Leave a Replay

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