Bonjour,

Je dois réaliser une ébauche de serveur HTTP (mais vraiment ébauche) et je me prend la tête depuis une éternité sur un bug bizarre. Soit les trois fonctions suivantes (entre autre) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void lireRequete(FILE* stream,char repertoireTravail[],char fichierHTMLErreur[],char retour[]) {
	char nomFichier[50];
	char versionHTTP[30];
 
	strcpy(retour, repertoireTravail);
	if( fscanf(stream, "GET /%s HTTP/%s", nomFichier, versionHTTP)!=-1) {	
		if (nomFichier!=NULL) {
			strcat(retour,nomFichier);
		}
		else {
			strcat(retour,fichierHTMLErreur);
		}
	}
}
 
int envoyerResultat(FILE* stream, char nomFichier[]) {		
	fprintf(stream,"HTTP/1.x 200 OK\n");
	fprintf(stream,"Content-Type: text/html\n\n");
	/* Plus tard ici sera la vérification de l'existence du fichier
	et l'envoie de son contenu au lieu de son nom... */
	fprintf(stream,nomFichier);
	fprintf(stream,"\n");
	return 1;
}
 
int traiterRequete(int socketClient,char *repertoireTravail,char *fichierHTMLErreur) {  
	char *nomFichier;
	FILE* stream;
 
	stream=fdopen(socketClient,"r+");
	if (stream!=NULL) {
		lireRequete(stream,repertoireTravail,fichierHTMLErreur,nomFichier);
		/*printf("%s\n",nomFichier);*/
		envoyerResultat(stream,nomFichier);
		return 1;
	}
	else {
		printf("ERROR\n");
		return 0;
	}
	fclose(stream);
}
traiterRequete() reçoit bien un socketClient valide quand je l'appelle.

Le fscanf() du lireRequete() fait bien sont boulot. Que la requête "GET /index.html HTTP/1.0" soit envoyée par Firefox, telnet ou un exécutable en C il récupère bien le nom du fichier et la version d'HTTP.

Par contre au niveau du premier fprintf() de envoyerResultat() j'ai un Segmentation Fault ! Après avoir cherché je me suis aperçu qu'un fprintf() placé avant le fscanf() est reçu par le client mais crashe le serveur si il se trouve après le fscanf() dans l'ordre d'exécution.

Voyez-vous ce qui peut planter ?

Le projet "complet" avec un compile.sh au lieu d'un makefile (pas taper) se trouve ici : http://dl.getdropbox.com/u/96825/fprintf.zip

Merci d'avance.