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

  FORUM HardWare.fr
  Programmation
  C

  pourquoi mon socket est non bloquant ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pourquoi mon socket est non bloquant ?

n°917390
psychotek
Posté le 07-12-2004 à 20:10:57  profilanswer
 

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

mood
Publicité
Posté le 07-12-2004 à 20:10:57  profilanswer
 

n°917694
psychotek
Posté le 08-12-2004 à 09:21:13  profilanswer
 

[:atreyu]


Message édité par psychotek le 08-12-2004 à 09:22:07
n°918017
docmaboul
Posté le 08-12-2004 à 15:36:05  profilanswer
 

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
n°918600
psychotek
Posté le 09-12-2004 à 09:40:06  profilanswer
 

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.


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

  pourquoi mon socket est non bloquant ?

 

Sujets relatifs
Réseau : quel formalisme pour les socket() ?[JAVA Socket] ou comment detecter qd un client s'est deconnecté?
les socketC++ Builder Socket Bloquant !
Java erreur de socket (win) 10106Reseau Socket - Problème de bind() dans un client/serveur local
Passage 1.3.1 à 1.4.2 : question socket[Perl] probleme de socket bloquant
recv non bloquant en progra socket (connected)socket non bloquant ????
Plus de sujets relatifs à : pourquoi mon socket est non bloquant ?


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