ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 2007
-
16 sept. 2005 à 09:38
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 2007
-
17 sept. 2005 à 07:16
salut a tous,
j'ai posté un précédent message sur un sujet similaire mais j'ai pas eu d'explication comprehensible.
voila je suis en train de realiser un serveur http et j'arrive pas a transmettre tout ce qui est binaire au navigateur.
pour les fichiers texte(html, txt ...) aucun pb: j'utilise les fonction createfile, readfile et closehandle de winsock2 pour recuperer le contenu du fichier, le mettre dans un buffer et transferer le contenu au navigateur via une socket.
j'ai une boucle qui capte toutes les requetes du navigateur. lorsque j'envoie une page html vide avec juste une image en background, le navigateur m'envoie 2 requetes:
- la 1ere pour la page html
- la 2e pour l'image jpeg d'arriere plan.
pour la 2e requete, le navigateur reste bloqué sur en attente de la reponse. donc en gros mon navigateur ne lui envoie pas la photo en binaire.
donc voici ma question: comment ouvrir un fichier binaire (en lecture bien sur) et le transferer dans une socket au navigateur avec les fonctions createfile et readfile ? quels sont les flags a specifier ? si cela semble plus aisée avec une autre api, je suis aussi preneur.
merci de vos reponses
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 10:17
je te remercie de ton apport mais c'est deja ce que je faisais mais a la suite du CreateFile("monfichier.jpg", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0), lorsque j'eesaie de recuper la taille du fichier pour la mettre dans l'entente HTTP Content-Length,
il me retroune -1 avec la fonction tailleFichier = GetFileSize(file,NULL);
et pourtant la page html il me retourne bien la bonne taille (1072 pour ma page de test).
donc si la taille est a -1, soit il n'arrive pas a ouvrir le jpeg, soit je ne specifie pas les bons flags. c'est pkoi reste en attente car il ne recoit pas la photo de mon serveur .... le buffer qui lui est envoyé est vide ...
GRRRRR je vais m'arracher les cheveux
j'ai deja une calvitie naissante
cs_Arnotic
Messages postés933Date d'inscriptiondimanche 1 avril 2001StatutMembreDernière intervention 9 janvier 2012 16 sept. 2005 à 10:24
Oui,
De plus pour vérifier l'ouverture du fichier il faut faire : if(hfl != INVALID_HANDLE_VALUE)
De cette manière tu pourras voir si ca vient de l'ouverture du fichier.
@+
Arnotic,
Admin CS,
Développeur chez Néos SDI,
MVP Visual C++
Vous n’avez pas trouvé la réponse que vous recherchez ?
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 11:11
c'est vrai.
en verifiant le handle il est bien valide et je recupere a present la taille du fichier mais maintenant il envoie du binaire au navigateur.
voici ce qu'il envoie au navigateur: ÿØÿà
et voici un apercu du code:
tout ce code est contenu dans la boucle de reception des requetes
la variable taille fichier recoit bien 1072 pour la 1e requete et 167010 pour la seconde requete donc il ouvre bien le fichier jpeg.
mais il envoie des hieroglyphes au navigateur
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 11:45
le fichier jpeg contient en fait 163810 octets (getfilesize)et en recuperant la valeur de la fonction send par
int i = send(acceptSocket,reponse,tailleFichier+1024,0);
il m'affiche 164834 octets. donc il envoie bien le fichier et l'entete http.
je faisais avec firefox et c'est pareil avec IE. il affiche toujours des hieroglyphes
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 16 sept. 2005 à 11:52
tailleFichier+1024 <<< T'es sure que ton entete fasse cette taille ? Normal que tu es des hieroglyphes, la socket de l'explorateur va lire trop loin dans le buffer de récéption. Il faut qur tu mettes la tailles exactes de ta requets, et non pas la taille du fichier + 1024. Puis d'ailleurs pourquoi 1024 ?
Le troisième parametre de la fonction send correspond a la tailles des données contenu dans le buffer, et non pas la taille du buffer!!!!
Tu dois donc lui passer la taille réelle de ta requetes et non pas la taille du buffer (taillefichier + 1024)!.
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 12:24
1024 au hasard pour la taille de l'entete http.
en utilisant strlen(reponse) send n'envoie que 80 et quelques d'octets.
mais en combinant taillefichier+tailleentete il envoie 163908, donc la taille exacte du fichier (163810) + la taille exacte de l'entete.
tout a l'heure il envoyait 164834.
mais ca fait exactement la meme chose.
pour arnotic: en fait je fais un strcat de octet dans reponse. c'est vrai que je ne l'ai pas mis dans le copier coller mais ca donne ca:
strcpy(reponse, "HTTP/1.0 200 OK\nContent-Type: image/jpeg\nContent-Encoding: gzip,deflate\n\n");
strcat(reponse, octet);
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 16 sept. 2005 à 12:32
Arnotic> T'es sure d'avoir bien lu le code ?
Un peu de bon sens...
Regarde ce qu'il a fait dans son send, il envoie que l'entete, il convient donc d'envoyer la taille de l'entete et non pas la taille du fichier + 1024.
ebooserge> Essaye de faire comme je te l'ai dis et dis moi ce que ca donne.
Dans la lancé envoie moi aussi la RFC avec le numéro de la page ou ils traitent de l'envoie des images (shellkode at hotmail.com)
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 13:12
comme je le disais plus haut, en utilsant strlen(reponse), la fonction send n'envoie que quelques octets qui correspondent a l'entete.
mais lorsque je fais taillefichier+taille entete, il envoie la taille exacte des 2 elements, et non plus la taille totale du buffer comme il me le faisait avant.
pour ce qui est de la rfc elle demande juste de specifier l'entete image/jpeg dans content-type et d'inclure l'image dans le corps de la reponse. etant donné que c'est une norme d'utilisation pour différents langages, elle ne specifie pas comment envoyer le fichier binaire en c++
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 16 sept. 2005 à 14:33
Ce qui me parait bizarre dans ton code, c'est le fait que ton serveur doit envoyer lui meme l'image.
Il me paraitrait plus logique que se soit l'explorateur qui les récupere lui meme.
Pour preuve, quand tu ouvres une pages web, tout d'abord, tout le texte va s'afficher, ensuite a la fin les images von etre telechargées puis afficher une a une.
La preuve que cela se passe bien en dehors de l'entete.
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 14:50
tout a fait car lorsque le navigateur demande une page html, il ne sait pas ce qu'il ya dedans.
le serveur lui non plus ne sait pas ce qu'il ya dedans.
c'est au navigateur d'analyser les balises html et s'il ya des images, il envoie une requete pour chaque image referencée (et non pas contenue) dans la page html.
en gros:
une page html simple avec que du texte => une seule requete du navigateur
une page avec du texte et un background image => 2 requetes du navigateurs.
donc il faut lui envoyer d'abord la page et ensuite s'il tedemande la photo pour le background, tu dois lui envoyer la photo qui se trouve dans le dossier de tes pages web en principe ou ailleurs sur ton pc.
l'explorateur n'y est strictement pour rien.
et puis je l'ai vérifié car avec la boucle de capture des requetes et la fonction recv, je recois d'abord la demande de la page(settings.html). je lui envoie la page, il commence a l'affiche et ensuite il m'envoie une 2e requete pour me demander la photo. et c'est la que ca coince.
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 15:39
je te remercie pour cette source ...
je suis en train de la decortiquer et je vous dirais si ca marche et les modifs qu'il fallait faire avant de cliquer sur reponse acceptée. ca pourra toujours aider quelqu'un d'autre
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 16 sept. 2005 à 17:34
Yop,
Si t'as besoin d'aides pour la compréhension du code n'hésites pas.
J'y ai jeté un oeil mais ca a l'air de resté basique.
Tu risques plus d'avoir des problèmes de compréhension au niveau de la méthode employé par le gars que par les lignes de codes elles memes.
Si tu ne connais pas les thread se sera peut etre la seule difficulté.
ebooserge
Messages postés137Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention16 juillet 20071 16 sept. 2005 à 17:55
pour les threads ca va ya pas de pb.
je faisais une pause donc j'ai pas encore regardé.
mais c'a m'a l'air un peu long.
je vois qu'il ouvre son fichier avec la fonction standard fopen et qu'il specifie les param "a+b" en ouverture, avec b pour binary.
ensuite la methode est ingenieuse pour recuperer la taille du fichier.
mais j'ai pas trouvé la section ou il fait l'envoi des données au navigateur. (le send)
si tu peux juste m'extraire cette petite partie car je la trouve pas.
pour le moment je fais l'interface graphique (je sais ca peut se faire en ligne de commande mais j'aime bien les interfaces graphiques )