Mon Serveur HTML n'envoie pas les images jpg contenu dans la page???

bravcharlie Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 21 mai 2005 - 8 avril 2005 à 20:49
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 - 11 avril 2005 à 10:40
Je suis en train de faire un serveur html, celui ci fonctionne correctement
lorsqu'il faut envoyer des pages de texte html, mais lorsque je met une photo
dans la page html celle ci n'est pas chargé.
Pourriez vous m'expliquer pourquoi et corriger mon code.
Meci beaucoup; voici mon code entier:

/* programme Serveur
Alloue un socket
puis en boucle
1) attend une nouvelle connexion du client
2) envoie un message court au client
3) ferme la connexion
fin boucle

Syntaxe : serveur [port]
port numéro de port à utiliser (optionnel, par défaut PROTOPORT)
*/


#include <winsock2.h>
#include <stdio.h>j
#include <string.h>


#define PROTOPORT 80
#define QLEN 10


int visits =0;


typedef struct
{
int taille;
unsigned char *tab;
}ttrame;


void main(int argc, char ** argv)
{
//struct hostent *ptrh; //pointeur table d'hôtes
struct protoent *ptrp; // pointeur table de protocoles
struct sockaddr_in sad; // structure pour adresse serveur
struct sockaddr_in cad; // structure pour adresse client
int sd,sd2; // descripteurs de socket
int port; // numero de port
int alen;
int error;
char buf[1000];


int nb,i,j; //Nombre de caractères recus
ttrame donnees;
char nompage[127];
char *pChar;
FILE *PAGE;


WORD wVersionRequested;



WSADATA wsaData;


wVersionRequested = MAKEWORD( 2, 0 );

WSAStartup (wVersionRequested,&wsaData); // initialisation de winsock2.0



memset((char*)&sad,0,sizeof(sad)); //effacer struct sockaddr_in
sad.sin_family =AF_INET; //définir famille internet pour la socket du serveur


/* rechercher l'argument PORT de la la ligne de commande s'il est spécifié
sinon prendre PROTOPORT */


if (argc>1) //si numero de port spécifié au niveau de la ligne de commande
{
port = atoi(argv[1]); //conversion de la chaine de caractère en binaire
}
else //protocole par défaut


{
port=PROTOPORT;
}



if (port>0) sad.sin_port=htons((u_short)port); //fonction qui inverse les octets
else
{
printf("numero de port invalide :%s \n",argv[1]);
exit(1);
}



/* Convertir le nom de protocole de transport TCP/IP en n° de protocole */


if ( ((int)(ptrp=getprotobyname("tcp")))==0) //fonction qui retourne les informations relatives au protocoel TCP
{ printf("conversion de tcp impossible");
exit(1);
}



/* Créer une Socket */


sd =socket(PF_INET, SOCK_STREAM, ptrp->p_proto); // création de la socket d'écoute
if (sd<0)
{printf("erreur (socket)\n");
exit(1);
}


/* Lier une adresse locale à la socket */


if (bind(sd, (struct sockaddr *)&sad, sizeof(sad))<0)
{ fprintf(stdout,"erreur (bind) \n");
exit(1);
}


/* spécifier la taille de la file d'attente des requêtes */


if (listen(sd,QLEN)<0) // création de la file d'attente associé à la socket d'écoute
{ fprintf(stdout,"erreur (listen)\n");
exit(1);
}


/* Boucle principale (accepter les requêtes et les traiter) */
alen=sizeof(cad);
while(1)
{
if ( (sd2=accept(sd, (struct sockaddr *)&cad, &alen)) <1 ) //acceptation de la connexion, création de la socket de service
{ fprintf(stdout,"accept failed %d \n",sd2);
exit(1);
}


//--------------------------------------------------------------------------------
nb = recv(sd2,buf,sizeof(buf),0);
buf[nb]='\0';
printf("%s",buf);



//On recupere la page à afficher
pChar=strstr(buf,"GET /");


if(pChar==NULL)
{
printf("erreur !!!");
exit(1);
}
if(pChar[5]==' ')
{
strcpy(nompage,"indexminiservweb.html");
}
else
{
i=5;
j=0;
while(pChar[i]!=' ')
{
nompage[j]=pChar[i];
i++;
j++;
}
nompage[j]='\0';
}
PAGE=fopen(nompage,"rt");


//AU lieu de mettre exit 1 ,On remplace par un message au client et on ne ferme pas le serveur
if(PAGE==NULL)
{
sprintf(buf," Erreur ouverture de fichier. ");
send(sd2,buf,strlen(buf),0); //envoi du message sur la socket de service
closesocket(sd2);



}
else
{

//on va à la fin du fichier pour connaitre sa taille
fseek(PAGE,0,SEEK_END);
donnees.taille=ftell(PAGE);//donne la taille de la page
donnees.tab=(char *) realloc(NULL,sizeof(char)*donnees.taille);

//Remplacer pour la version finale par un message genre problème d'allocation, contacter le webmaster...
if(donnees.tab==NULL)
{

sprintf(buf," Probleme d'allocation dynamique ");
send(sd2,buf,strlen(buf),0); //envoi du message sur la socket de service
closesocket(sd2);


}
else
{
i=0;
rewind(PAGE);//revient au debut du fichier
while(!feof(PAGE))
{
fread(&(donnees.tab[i]),1,1,PAGE);
i++;
}
donnees.taille=i-1; //modif de la taille à cause de W2K
if(PAGE!=NULL) fclose(PAGE);

send(sd2,donnees.tab,donnees.taille,0); //envoi du message sur la socket de service


// visits++;
// création du message à envoyer
// sprintf(buf," %d contact%s sur ce serveur. ", visits, visits==1?" ":"s");
// send(sd2,buf,strlen(buf),0); //envoi du message sur la socket de service

closesocket(sd2); //fermeture de la socket de service
}
}
}


}

8 réponses

minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
8 avril 2005 à 22:40
Je n'ai pas lu ton code jusqu'au bout (il est long). J'aimerai savoir
quelques trucs. Est ce que tu envoi ton image en même temps que la page
(même connection) ? Si c'est le cas, il faut savoir que le serveur HTTP
ne renvoi que ce que l'on lui demande. Ce n'est donc pas à lui de
fouiller dans le page pour trouver ce qu'il doit envoyé en plus.

Si ce n'est pas le cas là, je regarderai plus en détails le code demain.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
bravcharlie Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 21 mai 2005
9 avril 2005 à 11:50
Non je n'envoie pas l'image en meme temps que la page HTML, je l'envoie juste apres.
Par contre je pense qu'elle utilise la meme connection, mais je ne vois pas le probleme pour la connection. Merci.
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
9 avril 2005 à 11:59
Il me semble que le serveur HTTP fonctionne comme ci :

- recoit une requète de la part d'un navigateur (ouverture de la connection)

- envoi la page demander dans la requète (toujours dans la même connection)

- une fois la page envoyer, fin de la connection

Si il y a des images dans la page html envoyée, le navigateur renverra
une requète pour que le serveur la lui envoi de la même manière qu'au
dessus.

C'est la connection qui détermine la fin de fichier, le navigateur
n'est pas connecter tout le temps au serveur, il se connecte que pour
demaner quelque chose.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
bravcharlie Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 21 mai 2005
9 avril 2005 à 23:57
Alors si je comprend bien, normalement le navigateur distant me demande une page , je lui envoie (repond a ca requete) et ferme la connection. Et si une photo est presente dans la page, le navigateur distant va me renvoyer une requete pour que je lui envoie la photo. Mais d'apres mon programme c'est bien ce que je fais mais ca ne fonctionne pas. faudrait il alors que je scanne la page qu'il me demande pour voir si une photo est present et lui envoie en meme temps, dans la meme connection que la page demander??? (Merci pour les reponses rapide c'est sympa!)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
10 avril 2005 à 01:02
De rien pour les réponses rapides, on est là pour ça.

Cela dit, je trouve (c'est un opinion perso) que ton code et mal fait,
tu devrais créer plus de fonctions que tu appelleras dans le main. Là
on s'y perd un peu. Ensuite afficher (ou fait un log) des requêtes (et
des connections), ça te permetera de voir un peu se qui se passe au
niveau du serveur. Et avec un peu de chance tu verras pourquoi les
photos ne s'envoi pas.

Au fait, je n'ai pas trop prêté attention, mais envoi tu correctements
les réponse au requête (entête, typemine,...) ? Le prob viens peut etre
de la aussi.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
10 avril 2005 à 01:06
Pour t'aider un peu mieux dans ta quête : http://www.salemioche.com/http/

Cela pourra grandement t'aider

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
bravcharlie Messages postés 6 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 21 mai 2005
10 avril 2005 à 20:23
Merci pour le site, il etait interressant. Par contre je n'ai pas trouver de solution pour mon probleme mais merci encore. je vais encore cherché car je ne vois vraiment pas ce qui ne va pas. Bref merci pour tous.
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
11 avril 2005 à 10:40
tu devrais essayé de télécharger l'image avec le navigateur en la mettant dans la barre d'adresse.

Et voir si il la télécharge. Et me du code pour afficher les requêtes entrantes. Ainsi tu verra si l'image est demandée.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
Rejoignez-nous