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
}
}
}
}