psychotek | 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 :
- 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 :
- for (;;) /* Run forever */
- {
- /* Set the size of the in-out parameter */
- long_adr_client = sizeof(adr_client);
-
- /* Wait for a client to connect */
- if ((socket_client = accept(socket_serveur, (struct sockaddr *) &adr_client,
- &long_adr_client)) < 0)
- erreur_fatale("accept() failed" );
- fcntl(socket_client, F_SETFL, 0); /*rend bloquant*/
- /* socket_client is connected to a client! */
- printf("Adresse du client : %s\n", inet_ntoa(adr_client.sin_addr));
- if(i = client_vide() == -1)
- erreur_fatale("plus de place" );
- clients[i].fd = socket_client;
-
- printf("Numero du client : %i\n", i);
- pthread_create(&(clients[i].p), NULL, gestion_client, (void *)i);
- }
|
et la fonction gestion_client :
Code :
- void *gestion_client(void * arg)
- {
- char tampon[TAILLE_CHAINE]; /* Buffer for echo string */
- int taille_message; /* Size of received message */
- int i = (int) arg;
- bzero(tampon, TAILLE_CHAINE);
- /* Receive message from client */
- if ((taille_message = recv(clients[i].fd, tampon, TAILLE_CHAINE, 0)) < 0)
- erreur_fatale("recv() failed" );
- /* Send received string and receive again until end of transmission */
- while (taille_message >= 0) /* zero indicates end of transmission */
- {
- printf("message recu : %s\n", tampon);
- /* Echo message back to client */
- if (send(clients[i].fd, tampon, taille_message, 0) != taille_message)
- erreur_fatale("send() failed" );
- /* See if there is more data to receive */
- if ((taille_message = recv(clients[i].fd, tampon, TAILLE_CHAINE, 0)) < 0)
- erreur_fatale("recv() failed" );
- }
- printf("on est sorti de la boucle, on close\n" );
- close(clients[i].fd); /* Close client socket */
- }
|
le résultat, c'est que ça boucle en réécrivant le premier message reçu !
merci |