InternetReadFile et InternetOpenUrl ???

stefdem Messages postés 11 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 29 septembre 2005 - 10 déc. 2003 à 19:53
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 23 oct. 2004 à 18:09
Bonjour,

Quelqu'un aurait-il un code qui met en pratique les fonctions InternetReadFile et InternetOpenUrl ?

Tout ce que je peux trouver sur le sujet est tout sauf clair.

Je souhaite faire un programme qui lit le contenu d'un fichier texte situé sur un site internet. Le fichier serait accessible via une url du type http://www.monsite.fr/fichier.txt

Merci beaucoup ! :-)

Stefdem

21 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 déc. 2003 à 20:30
Salut,
Dabord tu appeles InternetOpen(...) qui te retourne un handle internet.
Tu passes ce handle internet + ton url a InternetOpenUrl(...) qui te retourne un handle sur le fichier.
Ensuite tu peux utiliser ce handle dans InternetReadFile(...) pour lire le fichier ou dans InternetQueryDataAvailable(...) pour obtenir la taille du fichier (utile pour l'alloc mémoire).
0
stefdem Messages postés 11 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 29 septembre 2005
10 déc. 2003 à 21:24
Merci pour la réponse, mais j'aimerais beaucoup avoir un exemple basique et fonctionnel.

J'aime le concret.

Stefdem
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 déc. 2003 à 21:34
Salut,
Pour lire un fichier texte sur le net et l'afficher dans une messagebox:

#include <windows.h>
#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")

char szURL[] = "";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
char * pFile;DWORD dwFileSize 0, dwByteRead 0;
DWORD dwContext = 0;
HINTERNET hSession, hUrl;
hSession = InternetOpen("test", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
if(hSession == NULL) return 0;
hUrl = InternetOpenUrl(hSession, szURL, 0, 0, INTERNET_FLAG_EXISTING_CONNECT, (DWORD_PTR)&dwContext);
if(hUrl == NULL) return 0;
InternetQueryDataAvailable(hUrl, &dwFileSize, 0, (DWORD_PTR)&dwContext);
pFile = (char*)malloc(dwFileSize+1);
memset(pFile, 0, dwFileSize);
InternetReadFile(hUrl, pFile, dwFileSize, &dwByteRead);
pFile[dwByteRead] = 0;
MessageBox(0, pFile, "le fichier", 0);
free(pFile);
InternetCloseHandle(hUrl);
InternetCloseHandle(hSession);
return 0;
}
0
stefdem Messages postés 11 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 29 septembre 2005
10 déc. 2003 à 23:01
aaahh le joli bout de code :-)
je l'essaye et je vous en dis des nouvelles

merci

Stefdem
0

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

Posez votre question
stefdem Messages postés 11 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 29 septembre 2005
11 déc. 2003 à 10:51
CA FONCTIONNE !!!

Stefdem
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
11 déc. 2003 à 17:09
Salut,
Heuresement, sinon je l'aurai jamais posté ici.
0
yugiohjcj Messages postés 26 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 18 août 2004
6 juil. 2004 à 02:38
C'est compliqué quand on passe par une API.
Les commanes ne sont pas celles qu'on à l'habitude de voir comme fopen(), printf(),...
Est-ce que je pourrais pas avoir un exemple qui fait la même chose sauf que ce serait pour une interface texte et le plus simple possible?(n'y eiste t'il pas un equivalent pour Linux aussi?)
/*Acheter, Vendre, Echanger des cartes Yu-Gi-Oh! Jeu de Cartes à Jouer sur yugiohjcj.free.fr*/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
6 juil. 2004 à 02:51
Salut yugiohjcj,
Désolé mais j'ai jamais touché a linux donc je peux pas vraiment t'aider.
0
yugiohjcj Messages postés 26 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 18 août 2004
7 juil. 2004 à 01:46
Ok mais tu peux quand même me faire un code plus simple qui afficherait plutot avec printf () et donc qui serait compatible au DOS.
Peux tu me simplifier le code en n'utilisant pas le windows.h mais en utilisant toujours les sockets ?
/*Acheter, Vendre, Echanger des cartes Yu-Gi-Oh! Jeu de Cartes à Jouer sur yugiohjcj.free.fr*/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
7 juil. 2004 à 02:08
Salut,
Plus simple qu'avec des api, c'est difficilement faisable.
Ce que je te poste la se connecte au serveur http free et affiche le fichier http://yugiohjcj.free.fr/cherche.txt présent sur ton site.
C'est très très brouillon, il n'y a aucun traitement du header http ni des erreurs, juste l'essentiel pour afficher un petit txt.

Quelques explications quand meme:
1) on se connecte au serveur yugiohjcj.free.fr
2) on envoie la requette http:
"GET http://yugiohjcj.free.fr/cherche.txt HTTP/1.0\n\n"
(voir rfc http pour plus d'info)
3) le serveur http réponds en envoyant un header http contenant les infos du fichier, puis une ligne vide ("\r\n\r\n"), puis le fichier txt lui meme.
Une fois le tout transferé, il ferme la connexion.

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int main(void)
{
SOCKET s;
in_addr addr;
sockaddr_in sin;
hostent * host;
WSADATA wsa;
int octet_recu = 0;
char buffer[2048];

// initialisation winsock
WSAStartup(0x0202, &wsa);

// creation socket
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == SOCKET_ERROR){
printf("erreur socket()\n");}

// on rempli la structure sockaddr_in avec les info du serveur
host = gethostbyname("yugiohjcj.free.fr");
memcpy(&addr, host->h_addr, host->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(80); // HTTP
sin.sin_addr = addr;

// connexion
if(SOCKET_ERROR == connect(s,(sockaddr*)&sin, sizeof(sin))){
printf("erreur connect()\n");}

// creation & envoi de la requete http
strcpy(buffer, "GET http://yugiohjcj.free.fr/cherche.txt HTTP/1.0\n\n");
send(s, buffer, strlen(buffer), 0);

// reception (on supose qu'on recoit tout d'un coup)
octet_recu = recv(s, buffer, sizeof(buffer), 0);
buffer[octet_recu] = 0;

// affichage du header http + du fichier txt
printf("%s\n", buffer);

closesocket(s);
WSACleanup();
return 0;
}
0
yugiohjcj Messages postés 26 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 18 août 2004
7 juil. 2004 à 23:05
Génial. Merci. C'est exactement ça que je voulais!
J'ai juste 2 questions (sur des trucs de base je sais...) :
=>pourquoi utiliser int main(void) ? On ne peut pas mettre juste main() ?
=>return 0; est-il vraiement utile ? Je n'ai jamais mis cette fonction à la fin de mes programmes et ça fonctionne.
/*Acheter, Vendre, Echanger des cartes Yu-Gi-Oh! Jeu de Cartes à Jouer sur yugiohjcj.free.fr*/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
7 juil. 2004 à 23:21
Salut,
"int main()" est aussi valide. Mais "main()" non.
il faut dire quelle type de valeur la fonction retourne (ici int).

return 0; n'est pas une fonction, c'est juste pour specifier la valeur de retour de la fonction main (ici zéro). Celle ci est déclarée en int, donc il faut lui faire retourner un int.
Si le return 0; t'embete, tu peux le virer et déclarer ta func en void main().

Je te rappelle que le code fourni plus haut ne traite pas la réponse http, ne gere pas les erreurs, etc.
0
yugiohjcj Messages postés 26 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 18 août 2004
8 juil. 2004 à 20:19
OK. Mais à quoi ça sert de préciser le type de la fonction main() ? Qu'elle soit int, char, ...Ca va changer quoi?
/*Acheter, Vendre, Echanger des cartes Yu-Gi-Oh! Jeu de Cartes à Jouer sur yugiohjcj.free.fr*/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
8 juil. 2004 à 21:17
Salut,
Pour la fonction main, effectivement que ca ne changera pas grand chose car tu n'exploites pas sa valeur de retour. Moi, je déclare toujours mes fonctions main en int main(void). C'est juste une habitude.
0
yugiohjcj Messages postés 26 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 18 août 2004
10 juil. 2004 à 15:14
Ouais je me suis renseigné à ce sujet...Maintenant je comprends ce que c'est que les valeurs de retour dans les fonctions.
Par contre, je viens de compiler ton programme et j'ai pleins de messges d'erreur:

Error E2451 test.c 8: Undefined symbol 'in_addr' in function main
Error E2379 test.c 8: Statement missing ; in function main
Error E2451 test.c 9: Undefined symbol 'sockaddr_in' in function main
Error E2379 test.c 9: Statement missing ; in function main
Error E2451 test.c 10: Undefined symbol 'hostent' in function main
Error E2451 test.c 10: Undefined symbol 'host' in function main
Error E2140 test.c 11: Declaration is not allowed here in function main
Error E2140 test.c 12: Declaration is not allowed here in function main
Error E2140 test.c 13: Declaration is not allowed here in function main
Error E2451 test.c 25: Undefined symbol 'addr' in function main
Error E2451 test.c 26: Undefined symbol 'sin' in function main
Error E2451 test.c 31: Undefined symbol 'sockaddr' in function main
Error E2188 test.c 31: Expression syntax in function main
:sad)
/*Acheter, Vendre, Echanger des cartes Yu-Gi-Oh! Jeu de Cartes à Jouer sur yugiohjcj.free.fr*/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 juil. 2004 à 15:23
Salut,
Tout est déclaré dans winsock2.h, devrait pas y avoir de probleme puisqu'il est inclus en haut du code.
Tu compiles avec quoi ?
0
yugiohjcj Messages postés 26 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 18 août 2004
12 juil. 2004 à 00:38
Je compile avec Borland C++ Compiler (gratuit).
bcc32 fichier.c
Mais normalement j'arrive bien à compiler mes programmes. Et j'ai vu que le fichier .h se touve bien dans le répertoire include.
/*Acheter, Vendre, Echanger des cartes Yu-Gi-Oh! Jeu de Cartes à Jouer sur yugiohjcj.free.fr*/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
12 juil. 2004 à 00:45
Salut,
Y'a quelques erreurs qui sont dues au fait que mon prog est en c++ (enfin il est en C, mais je déclare et j'initialise une variable sur la meme ligne, et ca en C tu ne peux pas).
Les erreurs dues a Winsock, je peux pas t'aider désolé.
Essaye de mettre a jour winsock2.h
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 oct. 2004 à 16:50
aardman> Le code que tu as écrit au début n'a pas l'air de très bien marcher pour récupérer la taille du fichier. Moi, InternetQueryDataAvailable me renvoie des valeurs qui n'ont rien a voir avec la taille du fichier que je télécharge...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 oct. 2004 à 18:01
Salut,
Mouais, l'exemple si dessus fonctionne car c'est un fichier txt (souvent moins d'un Ko).

Sinon je pense qu'il faudrait faire un truc du genre:

while(InternetQueryDataAvailable(...))
{
InternetReadFile(...);
WriteFile(...);
}
0
Rejoignez-nous