voici mon soucis, j'ai une boucle while (lu != 0 && server_state != 0), elle semble fonctionner correctement jusqu'au moment où lu=0 à ce moment on ne fait pas un tour de boucle supplémentaire mais le programme n'éxecute pas les instructions suivantes.
voici mon code C :
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <audio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
int main (){
int fd, err, errsend;
struct sockaddr_in addr;
struct sockaddr_in dest;
char msg[12];
socklen_t len, flen;
struct sockaddr_in from;
int wait = 0;
int server_state = 0;
int end;
// Arguments lecteur
ssize_t lu;
char *buffer;
char *filename = malloc(20 * sizeof(char));
int sample_rate = 0;
int sample_size = 0;
int channels = 0;
int apresEntete;
// Argument traitement plusieurs clients à la suite
int sel;
// Arguments timeout
int nb;
fd_set watch_over;
struct timeval timeout;
while(1){
fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd < 0){
printf("Erreur creation socket"); // remplacer les printf avec des perror
}
// struct sockaddr_in du serveur
addr.sin_family = AF_INET;
addr.sin_port = htons(5555);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
err = bind(fd, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
if(err < 0){
printf("Erreur Bind");
}
flen = sizeof(struct sockaddr_in);
FD_ZERO(&watch_over);
FD_SET(fd, &watch_over);
sel = select(fd+1, &watch_over, NULL, NULL, NULL);
if (sel > 0){
if (FD_ISSET(fd, &watch_over)){
// Reception du filename
len = recvfrom(fd, filename, sizeof(filename), 0, (struct sockaddr*) &from, &flen);
// On regarde si le serveur traite déjà un client
if (server_state == 1)
printf("serveur busy for the moment, please try later");
else {
if(len < 0){
printf("Erreur recvfrom");
}
// On dit que le serveur est occupé avec un client
server_state = 1;
printf("Received %d bytes from host %s port %d: %s\n", err, inet_ntoa(from.sin_addr),
ntohs(from.sin_port), filename);
// Lecteur
apresEntete = aud_readinit(filename, &sample_rate, &sample_size, &channels);
// Envoi de sample_rate, sample_size et channels au client
errsend = sendto(fd, (void *) &sample_rate, sizeof(sample_rate) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
if (errsend < 0){
printf("Erreur sendto sample_rate");
}
printf("sample_rate : %d \n", sample_rate);
errsend = sendto(fd, (void *) &sample_size, sizeof(sample_size) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
if (errsend < 0){
printf("Erreur sendto sample_size");
}
printf("sample_size : %d \n", sample_size);
errsend = sendto(fd, (void *) &channels, sizeof(channels) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
if (errsend < 0){
printf("Erreur sendto channels");
}
printf("channels : %d \n", channels);
buffer = malloc(sample_size);
lu = read(apresEntete, buffer, sample_size);
// Boucle lu != 0 pour envoyer les echantillons
errsend = sendto(fd, buffer, sizeof(buffer) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
while(lu != 0 && server_state != 0){
FD_ZERO(&watch_over);
FD_SET(fd, &watch_over);
timeout.tv_sec = 5;
timeout.tv_usec = 0;
nb = select(fd+1, &watch_over, NULL, NULL, &timeout);
if (nb==0){
server_state = 0;
}
else {
if (FD_ISSET(fd, &watch_over)){
if (recvfrom(fd, msg, sizeof(msg), 0, (struct sockaddr*) &from, &flen)){
errsend = sendto(fd, buffer, sizeof(buffer) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
}
}
if (errsend < 0){
printf("Erreur sendto");
}
}
lu = read(apresEntete, buffer, sample_size);
}
// On indique que le serveur peut traiter un autre client.
server_state = 0;
// On indique la fin de la lecture en envoyer au client NULL
printf("fin de la lecture");
errsend = sendto(fd, NULL, sizeof(NULL), 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
}
}
}
}
end = close(fd);
printf("la socket est fermée \n");
if(end < 0){
printf("Erreur close");
}
close(apresEntete);
free(buffer);
//A faire, fermer les malloc et les fichiers
}
- Edité par ThibaudNaegele1 24 mars 2018 à 17:45:31
Prenons le cas, où, ligne 137, nb vaut zéro. Tu mets alors server_state à zéro et.... il y reste indéfiniment. Tu restes donc coincé dans le while, quelle que soit la valeur de lu
- Edité par edgarjacobs 24 mars 2018 à 19:06:14
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Je ne suis pas sur de comprendre, une fois "server_state = 0;" éffectué je devrais sortir du if, sauter le else et au prochain tour de boucle je ne respecte pas la condition du while alors je saute aux instructions suivantes non?
Je ferme le ld " fd = socket(AF_INET,SOCK_DGRAM,0); " L43
Toutes les instructions à 'lintérieur du while(1) sont censées traiter la demande de packets d'un client auquel on envoi échantillon par échantillon un .wav qu'il lit au fur et à mesure, une fois traitée je dois refaire un autre tour de boucle lorsqu'un autre client envoi une requête.
Je ferme le ld " fd = socket(AF_INET,SOCK_DGRAM,0); " L43
Celui ouvert à quel tour de boucle de while(1) ... ?
Egalement, ta ligne 169 me semble plus que suspecte... envoie un vrai message!
- Edité par breizhbugs 25 mars 2018 à 19:11:55
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
instructions en sortie de while non-éxecutées
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent