pourquoi mon socket est non bloquant ?

pourquoi mon socket est non bloquant ? - C - Programmation

Marsh Posté le 07-12-2004 à 20:10:57    

salut all
 
je développe une petite application avec un serveur en C et un client en java, avec des socket bien sûr. pour gérer plusieurs clients, je crée un thread par client. les clients et le serveur échangent des messages grace à send et recv.
bon a priori ça marche pas trop mal SAUF QUE d'après ce que j'ai lu, mon socket devrait être bloquant. ainsi un thread qui fait un recv devrait bloquer dessus jusqu'à ce qu'il y ait qqch à lire. et ce n'est pas le cas !
j'ai l'impression que seul le premier recv est bloquant, les autres ne le sont plus. j'ai essayer de m'assurer que mon socket est bloquant avec :

Code :
  1. fcntl( socket_fd, F_SETFL, 0);


mais ça ne semble pas marcher.
 
qq'un aurait une idée svp ? parce que là je n'arrive pas à avancer.
merci
 
je mets un un peu de code pour que ce soit plus clair :
dans le main, après la création du socket, nous avons :

Code :
  1. for (;;) /* Run forever */
  2.     {
  3.       /* Set the size of the in-out parameter */
  4.       long_adr_client = sizeof(adr_client);
  5.      
  6.       /* Wait for a client to connect */
  7.       if ((socket_client = accept(socket_serveur, (struct sockaddr *) &adr_client,
  8.      &long_adr_client)) < 0)
  9. erreur_fatale("accept() failed" );
  10.       fcntl(socket_client, F_SETFL, 0); /*rend bloquant*/
  11.       /* socket_client is connected to a client! */
  12.       printf("Adresse du client : %s\n", inet_ntoa(adr_client.sin_addr));
  13.       if(i = client_vide() == -1)
  14. erreur_fatale("plus de place" );
  15.       clients[i].fd = socket_client;
  16.  
  17.       printf("Numero du client : %i\n", i);
  18.       pthread_create(&(clients[i].p), NULL, gestion_client, (void *)i);
  19.     }


 
et la fonction gestion_client :

Code :
  1. void *gestion_client(void * arg)
  2. {
  3.     char tampon[TAILLE_CHAINE];        /* Buffer for echo string */
  4.     int taille_message;                    /* Size of received message */
  5.     int i = (int) arg;
  6.     bzero(tampon, TAILLE_CHAINE);
  7.     /* Receive message from client */
  8.     if ((taille_message = recv(clients[i].fd, tampon, TAILLE_CHAINE, 0)) < 0)
  9.         erreur_fatale("recv() failed" );
  10.     /* Send received string and receive again until end of transmission */
  11.     while (taille_message >= 0)      /* zero indicates end of transmission */
  12.     {
  13.       printf("message recu : %s\n", tampon);
  14.       /* Echo message back to client */
  15.       if (send(clients[i].fd, tampon, taille_message, 0) != taille_message)
  16. erreur_fatale("send() failed" );
  17.       /* See if there is more data to receive */
  18.       if ((taille_message = recv(clients[i].fd, tampon, TAILLE_CHAINE, 0)) < 0)
  19. erreur_fatale("recv() failed" );
  20.     }
  21.     printf("on est sorti de la boucle, on close\n" );
  22.     close(clients[i].fd);    /* Close client socket */
  23. }


 
le résultat, c'est que ça boucle en réécrivant le premier message reçu !
merci

Reply

Marsh Posté le 07-12-2004 à 20:10:57   

Reply

Marsh Posté le 08-12-2004 à 09:21:13    

[:atreyu]


Message édité par psychotek le 08-12-2004 à 09:22:07
Reply

Marsh Posté le 08-12-2004 à 15:36:05    

Déjà, pour s'assurer que vous êtes en mode bloquant, il vaut mieux faire quelque chose comme ça:
 

Code :
  1. int flags = fcntl(fd, F_GETFL, 0);
  2. fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));


 
Ensuite, est-ce qu'il serait possible de voir le code du serveur?


Message édité par docmaboul le 08-12-2004 à 15:36:17
Reply

Marsh Posté le 09-12-2004 à 09:40:06    

salut
en fait ça y est j'ai la solution. mon schmilblick est bien bloquant. le problème était en fait que l'application client se déconnectait après avoir envoyé et reçu une commande (au lieu de garder la connexion ouverte, il la fermait après avoir fait ça). du coup le recv lisait du vide sur la socket, et hop ça partait en boucle (et je croyais par consequent que c'était non bloquant).
c'etait donc une fausse impression.
merci quand même pour ta réponse.

Reply

Sujets relatifs:

Leave a Replay

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