Problème de buffer avec recv

Problème de buffer avec recv - C - Programmation

Marsh Posté le 29-03-2006 à 22:36:25    

Bonjour,
 
Dans mon code j'ai :
 

Code :
  1. if ((err = recv(poll_list[i].fd, pSock, MAX_IO+1, 0)) < 1) {
  2.       if (poll_list[i].fd != s_listen) {
  3.        poll_list[i].fd = -1;
  4.        printf("Disconnected (%i)...\n", err);
  5.       }
  6.      } else {
  7.       // traitement de pSock
  8.       printf("recu de %i\n", poll_list[i].fd);
  9.       //pSock = NULL;
  10.      }
  11.     }


 
Comment est ce que je peut effacer pSock pour que dans ma boucle, son ancienne valeur ne revienne pas ?, pSock est défini ainsi : char *pSock = (char*)malloc(1+sizeof(char)*MAX_IO);
 
Le probleme quand je fait pSock = NULL, c'est que recv me retourne -1 a la prochaine boucle.
J'aimerais eviter de free et malloc a chaque boucle.
 
Merci :)

Reply

Marsh Posté le 29-03-2006 à 22:36:25   

Reply

Marsh Posté le 29-03-2006 à 22:49:55    

Dinan a écrit :

Code :
  1. if ((err = recv(poll_list[i].fd, pSock, MAX_IO+1, 0)) < 1) {


Comment est ce que je peut effacer pSock pour que dans ma boucle, son ancienne valeur ne revienne pas ?, pSock est défini ainsi :

Code :
  1. char *pSock = (char*)malloc(1+sizeof(char)*MAX_IO);



Il n'y a rien à effacer. Ce qui compte, c'est de tester le valeur retournée par recv(). C'est le nombre de bytes valides si il est > 0. On sait donc exactement où mettre le 0 si c'est une chaine.
 
Pour éviter le débordement, on passe une taille inférieure de 1 à recv().  Usage courant :  

Code :
  1. char data[128];
  2. int err = recv (fd, data, sizeof data - 1, 0);
  3. if (err >= 0)
  4. {
  5.    size_t n = err;
  6.    if (n != 0)
  7.    {
  8.       data[n] = 0;
  9.       printf ("received : '%s'", data);
  10.       fflush (stdout);
  11.    }
  12. }
  13. else
  14. {
  15.    /* erreur */
  16. }


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 29-03-2006 à 22:57:56    

Ha oui j'avait pas pensé à ca, merci ;)

Reply

Sujets relatifs:

Leave a Replay

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