begin process at 2010 02 09 22:45:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > RECUPERATION MÉTÉO INTERNET [C][VC.NET]

RECUPERATION MÉTÉO INTERNET [C][VC.NET]


 Information sur la source

Note :
8,67 / 10 - par 3 personnes
8,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Débutant Date de création :30/05/2004 Date de mise à jour :05/06/2004 02:16:38 Vu / téléchargé :5 528 / 446

Auteur : AlexMAN

Ecrire un message privé
Commentaire sur cette source (29)
Ajouter un commentaire et/ou une note

 Description

Bonjour,

Voila, mon code envoie une requete http a un serveur meteo (www.weather.Com), stocke une partie du code desiré dans un fichier, recupere ses infos, les trie et les affiche a l'ecran, c tout !
La ville choisie est Nimes, mais la liste est tres longue, j'ai mis cette ville car j'y habite, mettez la ville que vous voulez !

Source

  • #include <stdio.h>
  • #include <windows.h>
  • #include <winsock.h>///weather/local/FRXX0165
  • #pragma comment(lib, "ws2_32.lib")
  • enum {FAIL, SUCCESS};
  • #define NBRE_SEARCH 7
  • //Requete HTTP
  • char sCmdToSend[] = "GET http://fr.w3.weather.com/weather/local/FRXX0165 HTTP/1.1\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\r\nAccept -Language: fr\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept -Encoding: gzip , deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)\r\nHost: fr.w3.weather.com\r\nReferer : http://fr.w2.weather.com/common/jump2_fr.html?/weather/tenday/FRXX0004\r\n\r\n";
  • char sGood_Buffer[] = "<!-- Begin Main Content Here-->";
  • char sEnd_Buffer[] = "<TD COLSPAN=\"3\" ALIGN=\"CENTER\" VALIGN=\"middle\">";
  • //Balise entourant les commandes de 2 à 8
  • char sBalise_Deb[] = "<TD CLASS=\"currentObsText\">";
  • char sBalise_End[] = "</TD>";
  • //Balise entourant les 2premiers resultats (Temp et temp ressentie, Temp n'est pas dans la
  • //liste des cmd car elle ne figure pas dans la source de la page
  • char sBalise_FirstDeb[] = "\"TOP\">&nbsp;";
  • char sBalise_FirstEnd[] = "&deg;C";
  • char sSearch[NBRE_SEARCH][30] = { "", //NUMERIQUE
  • "Temp. ressentie", //NUMERIQUE
  • "Vent", //NON NUMERIQUE (je sais pas comment le dire !!)
  • "Point de ros", //NUMERIQUE
  • "Humidit", //NUMERIQUE
  • "Visibilit", //NUMERIQUE
  • "Pression barom" }; //NON NUMERIQUE (en effet, les données a recuperer sont numeriques mais j'ai eu quelques difficultés à cause d'un 'à' recalcitrant...
  • char sCmdFound[NBRE_SEARCH][40];
  • char sFile[] = "c:\\fuck.htm";
  • int iInitWinsock(void);
  • int iTreatCmd();
  • int iRequete(SOCKET);
  • char *sSearchIn(char *, const char *, const char *, const char *, int, int);
  • int iIsNumeric(char);
  • //Initialisation de Winsock
  • int iInitWinsock()
  • {
  • WORD wVersionRequested;
  • WSADATA wsaData;
  • int iReturn = 0;
  • wVersionRequested = MAKEWORD(2, 0);
  • if (iReturn = WSAStartup(wVersionRequested, &wsaData)) {
  • printf("Erreur lors de l'initialisation de winsock...\n");
  • system("PAUSE");
  • return FAIL;
  • }
  • return SUCCESS;
  • }
  • int main(int argc, char **argv)
  • {
  • struct sockaddr_in sinAddr;
  • struct hostent *hstServIP; //Stocke l'IP du serveur
  • SOCKET sckActiv;
  • int iReturn = 0;
  • int i = 0, j = 0;
  • if (iReturn = iInitWinsock()) { //Initialisation de winsock
  • printf("Initialisation de winsock effectu\202e...\n");
  • }
  • sckActiv = socket(AF_INET, SOCK_STREAM, 0); //Creation du socket
  • if (!(hstServIP = gethostbyname("fr.w3.weather.com"))) { //Recuperation de l'addresse IP du serveur
  • printf("Erreur lors de la r\202solution du nom de domaine...\n");
  • system("PAUSE");
  • return FAIL;
  • }
  • sinAddr.sin_addr.s_addr = *((u_long *)hstServIP->h_addr_list[0]); //"Stockage" de l'adresse IP convertie en unsigned long (u_long)
  • sinAddr.sin_port = htons(80); //Port 80 = HTTP
  • sinAddr.sin_family = AF_INET; //AF_INET = Protocole TCP/IP
  • while (iReturn = connect(sckActiv, (const struct sockaddr *)&sinAddr, sizeof(sinAddr))) { //Connexion du socket au serveur
  • printf("Impossible de se connecter au serveur...\n");
  • }
  • printf("Connexion avec le serveur \202tablie...\n");
  • iRequete(sckActiv); //Envoi de la requetre HTTP et puis "stockage" d'une partie de la source dans un fichier
  • iTreatCmd(); //Traite les infos contenus le fichier et stocke ces infos dans sCmdFound
  • printf("M\202t\202o a N\214mes : \n");
  • for (i = 0; i < NBRE_SEARCH; ++i) {
  • switch (i) {
  • case 0:
  • sprintf(sSearch[i], "Temp\202rature : %s Degr\202s C" , sCmdFound[i]);
  • break;
  • case 1:
  • sprintf(sSearch[i], "Temp. ressentie : %s Degr\202s C", sCmdFound[i]);
  • break;
  • case 2:
  • sprintf(sSearch[i], "Vent : %s", sCmdFound[i]);
  • break;
  • case 3:
  • sprintf(sSearch[i], "Point de ros\202e : %s Degr\202s C", sCmdFound[i]);
  • break;
  • case 4:
  • sprintf(sSearch[i], "Humidit\202 : %s%%" , sCmdFound[i]);
  • break;
  • case 5:
  • sprintf(sSearch[i], "Visibilit\202 : %s km", sCmdFound[i]);
  • break;
  • case 6:
  • sprintf(sSearch[i], "Pression barom\202trique : %s", sCmdFound[i]);
  • break;
  • }
  • printf("%s\n", sSearch[i]);
  • }
  • closesocket(sckActiv); //Fermeture du socket que l'on peut preceder de la fonction shutdown, mais ce n'est pas obligatoire...shutdown permet de "mettre en veille" la socket
  • WSACleanup(); //Ferme Winsock
  • system("PAUSE");
  • return SUCCESS;
  • }
  • // <TD CLASS="currentObsText">....</TD>
  • int iRequete(SOCKET sckOpen)
  • {
  • FILE *fSave;
  • char sPacket[8192]; //8192octets = limite de la taille d'un packet
  • char *sBuffer = NULL; //Pointeur sur sPacket
  • char *sRet_Str = NULL; //Pointeur char pour retour fonction strstr
  • int iRecup_Buf = 0; //Flag indiquant si le prog soit stocker le packet (sPacket) dans le fichier
  • int iReturn = 0; //Nbre d'octets recus par la fonction recv
  • send(sckOpen, sCmdToSend, sizeof sCmdToSend, 0); //Envoie de la requete http
  • fSave = fopen(sFile, "w"); //Ouvre le fichier en mode ecriture
  • while (iReturn = recv(sckOpen, sPacket, sizeof sPacket, 0)) { //Tant ke recv n'est pas nul (donc kon recoit un packet)
  • sBuffer = sPacket; // sBuffer pointe maintenant sur sPacket
  • if (!iRecup_Buf) { // Si iRecup_Buf est nul
  • if (sRet_Str = strstr(sBuffer, sGood_Buffer)) { // Si dans le packet se trouve la "balise" sGood_Buffer (permettant de couper la source au nivo des infos interessantes)
  • iRecup_Buf = 1; // Mise a 1 du flag iRecup_Buf permettant de "dire" au prog kil doit recuperer les packets suivants
  • sBuffer = sRet_Str; // sBuffer pointe alors sur la balise sGood_Buffer (dont l'adresse a été renvoyée par strstr)
  • fputs(sBuffer, fSave); // Ecriture dans le fichier du packet
  • } // Fin si
  • } else { // Fin Si, Sinon (si iRecup_Buf n'est pas nul donc ke la balise de depart (sGood_Buffer) a été trouvé)
  • if (sRet_Str = strstr(sBuffer, sEnd_Buffer)) { // Si la balise de fin (sEnd_Buffer) est presente dans le packet
  • sRet_Str[0] = 0; // Mettre a zero le premier caractere de la chaine renvoyée par strstr permet de "couper la chaine" a la balise de fin (Pour ne conserver ke les infos necessaires)
  • iRecup_Buf = 0; // Mettre a zero iRecup_Buf pour signaler ke le prog ne doit plus recuperer de packet (ayant trouve le dernier)
  • } // Fin Si
  • fputs(sBuffer, fSave); // Peu importe que la balise de fin soit trouvée, il faut, si iRecup_Buf n'est pas nul, ecrire le packet dans le fichier
  • } // Fin Si
  • memset(sPacket, 0, sizeof sPacket); // Mettre zero tous les octets de sPacket
  • sBuffer = NULL; // sBuffer ne pointe plus sur rien
  • } //Fin while
  • fclose(fSave); //Fermer le fichier
  • return SUCCESS;
  • }
  • int iTreatCmd()
  • {
  • FILE *fCmd;
  • char *sLine = NULL;
  • char *sRet_Search = NULL;
  • char *sBalise_Dep = sBalise_FirstDeb; //On initialise le pointeur de Balise de depart avec sBalise_FirstDeb car les 2 premiers commandes a trouver debutent par cette balise
  • char *sBalise_Arr = sBalise_FirstEnd; //Et au final, sont finis par cette balise
  • int iReturn = 0;
  • int iNumeric = 1; //Valeur passée en argument de la fonction sSearchIn ki permet de dire le les infos a recuperer sont de type numerik
  • int i = 0;
  • sLine = calloc(4608, sizeof(char)); //Alloue 4608octets au pointeur sLine, et initialise tous les octets a 0
  • fCmd = fopen(sFile, "r"); //Ouvre le fichier en mode lecture
  • iReturn = fread(sLine, sizeof(char), 4608, fCmd); //Lis la totalité du fichier, iReturn renvoie le nombre d'octets lus
  • sLine[iReturn] = 0; //A l'élément iReturn, place le caractere de fin de chaine '\0' (ou 0)
  • for (i = 0; i < NBRE_SEARCH; ++i) { //Tant ke i est inferieur au nombre de commandes...
  • if (i == 1) { //Si i == commande("Temp. Ressentie")
  • sBalise_Dep = strtok(sBalise_Dep, "\"TOP\">"); // "Decouper" une partie de la balise sBalise_Dep car elle ne correspond pas a la balise de depart de cette commande
  • } else if (i == 2 || i == 6) { //Si i == commande("Vent" ou "Pression barométrique")
  • iNumeric = 0; // Mettre a 0 le flag iNumeric permettant de dire a la fonction sSearchIn que les infos a recuperer sont numerik
  • if (i == 2) { // Si et seulement si i == commande("Vent")
  • sBalise_Dep = sBalise_Deb; // Changer les balise de depart
  • sBalise_Arr = sBalise_End; // Et de fin
  • } // Fin Si
  • } else { //Fin Si, Sinon (si i != 1, 2 ou 6)
  • iNumeric = 1; // Mettre a 1 le flag iNumeric
  • } //Fin Si
  • if (sRet_Search = sSearchIn(sLine, sSearch[i], sBalise_Dep, sBalise_Arr, i, iNumeric)) { //Si la fonction sSearchIn renvoie un pointeur non NULL
  • sLine = sRet_Search; // Faire pointer sLine sur la valeur de retour de sSearchIn (ki a été "decoupé" dans cette fonction ce qui permet de reduire le champ de recherche d'une commande)
  • } //Fin Si
  • }
  • sRet_Search = NULL; //sRet_Search point sur du vent !
  • fclose(fCmd); //Fermer le fichier
  • //free(sLine);*/ //J'alloue de la memoire dinamikement, mais le free ne marche po, je pense ke c du au fait ke je le fais pointer sur d'autres donnée...
  • return SUCCESS;
  • }
  • char *sSearchIn(char *sIn, const char *sCmd, const char *sBalise_D, const char *sBalise_E, int iNum_Cmd, int IsNumeric)
  • {
  • char *sRet_Str = NULL;
  • char *sDeb_Str = NULL;
  • char *sFin_Str = NULL;
  • int i = 0;
  • if (sRet_Str = strstr(sIn, sCmd)) { //Cherche la commande dans le fichier
  • sIn = sRet_Str + strlen(sCmd); //sIn "saute" la commande
  • if (sDeb_Str = strstr(sIn, sBalise_D)) { //Cherche la premiere balise
  • sDeb_Str += strlen(sBalise_D);
  • sIn = sDeb_Str; //sIn "saute" la balise
  • if (IsNumeric) { //Si l'argument est IsNumeric > 0 alors rechercher les infos "numeriques"
  • while (iIsNumeric(*sIn)) { //Tant que les caracteres sont numeriques; les recuperer...
  • sCmdFound[iNum_Cmd][i++] = sIn[0];
  • sIn++;
  • }
  • } else { //Si les données a recuperer ne sont pas numeriques
  • if (sFin_Str = strstr(sIn, sBalise_E)) { //Recherche de la balise de fin
  • while (sFin_Str - sDeb_Str) {
  • sCmdFound[iNum_Cmd][i++] = sDeb_Str[0]; //Recuperation des infos
  • sDeb_Str++;
  • }
  • }
  • }
  • sCmdFound[iNum_Cmd][i] = 0;
  • }
  • }
  • return sIn;
  • }
  • //Teste si le caractere en argument est numerique ou pas
  • int iIsNumeric(char cInt)
  • {
  • if (cInt >= '0' && cInt <='9') {
  • return SUCCESS;
  • }
  • return FAIL;
  • }
#include <stdio.h>
#include <windows.h>
#include <winsock.h>///weather/local/FRXX0165

#pragma comment(lib, "ws2_32.lib")

enum {FAIL, SUCCESS};

#define NBRE_SEARCH 7

//Requete HTTP
char sCmdToSend[] = "GET http://fr.w3.weather.com/weather/local/FRXX0165 HTTP/1.1\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\r\nAccept -Language: fr\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept -Encoding: gzip , deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)\r\nHost: fr.w3.weather.com\r\nReferer : http://fr.w2.weather.com/common/jump2_fr.html?/weather/tenday/FRXX0004\r\n\r\n";
char sGood_Buffer[] = "<!-- Begin Main Content Here-->";
char sEnd_Buffer[] = "<TD COLSPAN=\"3\" ALIGN=\"CENTER\" VALIGN=\"middle\">";
//Balise entourant les commandes de 2 à 8
char sBalise_Deb[] = "<TD CLASS=\"currentObsText\">";
char sBalise_End[] = "</TD>";
//Balise entourant les 2premiers resultats (Temp et temp ressentie, Temp n'est pas dans la
//liste des cmd car elle ne figure pas dans la source de la page
char sBalise_FirstDeb[] = "\"TOP\">&nbsp;";
char sBalise_FirstEnd[] = "&deg;C";

char sSearch[NBRE_SEARCH][30] = {	"",							//NUMERIQUE
									"Temp. ressentie",			//NUMERIQUE
									"Vent",						//NON NUMERIQUE (je sais pas comment le dire !!)
									"Point de ros",				//NUMERIQUE
									"Humidit",					//NUMERIQUE
									"Visibilit",				//NUMERIQUE
									"Pression barom" };			//NON NUMERIQUE (en effet, les données a recuperer sont numeriques mais j'ai eu quelques difficultés à cause d'un 'à' recalcitrant...
		

char sCmdFound[NBRE_SEARCH][40];

char sFile[] = "c:\\fuck.htm";

int iInitWinsock(void);
int iTreatCmd();
int iRequete(SOCKET);
char *sSearchIn(char *, const char *, const char *, const char *, int, int);
int iIsNumeric(char);


//Initialisation de Winsock
int iInitWinsock() 
{
	WORD		wVersionRequested;
	WSADATA		wsaData;
	int			iReturn = 0;

	wVersionRequested = MAKEWORD(2, 0);
	
	if (iReturn = WSAStartup(wVersionRequested, &wsaData)) {
		printf("Erreur lors de l'initialisation de winsock...\n");
		system("PAUSE");
		return FAIL; 
	}

	return SUCCESS;
}

int main(int argc, char **argv)
{
	struct		sockaddr_in sinAddr;
	struct		hostent *hstServIP;			//Stocke l'IP du serveur
	SOCKET		sckActiv;
	int			iReturn = 0;
	int			i = 0, j = 0;
	
	if (iReturn = iInitWinsock()) {										//Initialisation de winsock
		printf("Initialisation de winsock effectu\202e...\n");
	}

	sckActiv = socket(AF_INET, SOCK_STREAM, 0);							//Creation du socket

	if (!(hstServIP = gethostbyname("fr.w3.weather.com"))) {			//Recuperation de l'addresse IP du serveur
		printf("Erreur lors de la r\202solution du nom de domaine...\n");
		system("PAUSE");
		return FAIL;
	}

	sinAddr.sin_addr.s_addr = *((u_long *)hstServIP->h_addr_list[0]);	//"Stockage" de l'adresse IP convertie en unsigned long (u_long)
	sinAddr.sin_port = htons(80);										//Port 80 = HTTP
	sinAddr.sin_family = AF_INET;										//AF_INET = Protocole TCP/IP
	
	while (iReturn = connect(sckActiv, (const struct sockaddr *)&sinAddr, sizeof(sinAddr))) {	//Connexion du socket au serveur			
			printf("Impossible de se connecter au serveur...\n");
	}	
	printf("Connexion avec le serveur \202tablie...\n");

	iRequete(sckActiv);													//Envoi de la requetre HTTP et puis "stockage" d'une partie de la source dans un fichier
	iTreatCmd();														//Traite les infos contenus le fichier et stocke ces infos dans sCmdFound

	printf("M\202t\202o a N\214mes : \n");
	for (i = 0; i < NBRE_SEARCH; ++i) {
		switch (i) {
			case 0:		
				sprintf(sSearch[i], "Temp\202rature : %s Degr\202s C" , sCmdFound[i]);
				break;
			case 1: 
				sprintf(sSearch[i], "Temp. ressentie : %s Degr\202s C", sCmdFound[i]);
				break;
			case 2:
				sprintf(sSearch[i], "Vent : %s", sCmdFound[i]);
				break;
			case 3:
				sprintf(sSearch[i], "Point de ros\202e : %s Degr\202s C", sCmdFound[i]);
				break;
			case 4:		
				sprintf(sSearch[i], "Humidit\202 : %s%%" , sCmdFound[i]);
				break;
			case 5: 
				sprintf(sSearch[i], "Visibilit\202 : %s km", sCmdFound[i]);
				break;
			case 6:
				sprintf(sSearch[i], "Pression barom\202trique : %s", sCmdFound[i]);
				break;
		}
		printf("%s\n", sSearch[i]);
	}

	closesocket(sckActiv);								//Fermeture du socket que l'on peut preceder de la fonction shutdown, mais ce n'est pas obligatoire...shutdown permet de "mettre en veille" la socket
	WSACleanup();										//Ferme Winsock

	system("PAUSE");
	return SUCCESS;

}
// <TD CLASS="currentObsText">....</TD>

int iRequete(SOCKET sckOpen) 
{
	FILE		*fSave;				
	char		sPacket[8192];		//8192octets = limite de la taille d'un packet
	char		*sBuffer = NULL;	//Pointeur sur sPacket 
	char		*sRet_Str = NULL;	//Pointeur char pour retour fonction strstr
	int			iRecup_Buf = 0;		//Flag indiquant si le prog soit stocker le packet (sPacket) dans le fichier
	int			iReturn = 0;		//Nbre d'octets recus par la fonction recv

	send(sckOpen, sCmdToSend, sizeof sCmdToSend, 0);	//Envoie de la requete http	
	fSave = fopen(sFile, "w");							//Ouvre le fichier en mode ecriture

	while (iReturn = recv(sckOpen, sPacket, sizeof sPacket, 0)) {	//Tant ke recv n'est pas nul (donc kon recoit un packet)
		sBuffer = sPacket;											//	sBuffer pointe maintenant sur sPacket
		if (!iRecup_Buf) {											//	Si iRecup_Buf est nul
			if (sRet_Str = strstr(sBuffer, sGood_Buffer)) {			//		Si dans le packet se trouve la "balise" sGood_Buffer (permettant de couper la source au nivo des infos interessantes)
				iRecup_Buf = 1;										//			Mise a 1 du flag iRecup_Buf permettant de "dire" au prog kil doit recuperer les packets suivants
				sBuffer = sRet_Str;									//			sBuffer pointe alors sur la balise sGood_Buffer (dont l'adresse a été renvoyée par strstr)
				fputs(sBuffer, fSave);								//			Ecriture dans le fichier du packet
			}														//		Fin si
		} else {													//	Fin Si, Sinon	(si iRecup_Buf n'est pas nul donc ke la balise de depart (sGood_Buffer) a été trouvé)	
			if (sRet_Str = strstr(sBuffer, sEnd_Buffer)) {			//		Si la balise de fin (sEnd_Buffer) est presente dans le packet
				sRet_Str[0] = 0;									//			Mettre a zero le premier caractere de la chaine renvoyée par strstr permet de "couper la chaine" a la balise de fin (Pour ne conserver ke les infos necessaires)
				iRecup_Buf = 0;										//			Mettre a zero iRecup_Buf pour signaler ke le prog ne doit plus recuperer de packet (ayant trouve le dernier)
			}														//		Fin Si
			fputs(sBuffer, fSave);									//		Peu importe que la balise de fin soit trouvée, il faut, si iRecup_Buf n'est pas nul, ecrire le packet dans le fichier
		}															//	Fin Si
		memset(sPacket, 0, sizeof sPacket);							//	Mettre zero tous les octets de sPacket
		sBuffer = NULL;												//	sBuffer ne pointe plus sur rien
	}																//Fin while
	fclose(fSave);													//Fermer le fichier

	return SUCCESS;
}


int iTreatCmd()
{
	FILE		*fCmd;
	char		*sLine = NULL;
	char		*sRet_Search = NULL;
	char		*sBalise_Dep = sBalise_FirstDeb;	//On initialise le pointeur de Balise de depart avec sBalise_FirstDeb car les 2 premiers commandes a trouver debutent par cette balise
	char		*sBalise_Arr = sBalise_FirstEnd;	//Et au final, sont finis par cette balise
	int			iReturn = 0;
	int			iNumeric = 1;						//Valeur passée en argument de la fonction sSearchIn ki permet de dire le les infos a recuperer sont de type numerik
	int			i = 0;	

	sLine = calloc(4608, sizeof(char));				//Alloue 4608octets au pointeur sLine, et initialise tous les octets a 0
	fCmd = fopen(sFile, "r");						//Ouvre le fichier en mode lecture
		
	iReturn = fread(sLine, sizeof(char), 4608, fCmd);	//Lis la totalité du fichier, iReturn renvoie le nombre d'octets lus
	sLine[iReturn] = 0;									//A l'élément iReturn, place le caractere de fin de chaine '\0' (ou 0)
		
	for (i = 0; i < NBRE_SEARCH; ++i) {						//Tant ke i est inferieur au nombre de commandes...
		if (i == 1) {										//Si i == commande("Temp. Ressentie")
			sBalise_Dep = strtok(sBalise_Dep, "\"TOP\">");	//	"Decouper" une partie de la balise sBalise_Dep car elle ne correspond pas a la balise de depart de cette commande
		} else if (i == 2 || i == 6) {						//Si i == commande("Vent" ou "Pression barométrique")
			iNumeric = 0;									//	Mettre a 0 le flag iNumeric permettant de dire a la fonction sSearchIn que les infos a recuperer sont numerik
			if (i == 2) {									//	Si et seulement si i == commande("Vent")
				sBalise_Dep = sBalise_Deb;					//		Changer les balise de depart 
				sBalise_Arr = sBalise_End;					//		Et de fin
			}												//	Fin Si	
		} else {											//Fin Si, Sinon (si i != 1, 2 ou 6)
			iNumeric = 1;									//		Mettre a 1 le flag iNumeric	
		}													//Fin Si
		if (sRet_Search = sSearchIn(sLine, sSearch[i], sBalise_Dep, sBalise_Arr, i, iNumeric)) {	//Si la fonction sSearchIn renvoie un pointeur non NULL
			sLine = sRet_Search;																	//	Faire pointer sLine sur la valeur de retour de sSearchIn (ki a été "decoupé" dans cette fonction ce qui permet de reduire le champ de recherche d'une commande)
		}																							//Fin Si
	} 
	sRet_Search = NULL;			//sRet_Search point sur du vent !
	fclose(fCmd);				//Fermer le fichier
	//free(sLine);*/			//J'alloue de la memoire dinamikement, mais le free ne marche po, je pense ke c du au fait ke je le fais pointer sur d'autres donnée...

	return SUCCESS;
}

char  *sSearchIn(char *sIn, const char *sCmd, const char *sBalise_D, const char *sBalise_E, int iNum_Cmd, int IsNumeric)
{
	char		*sRet_Str = NULL;
	char		*sDeb_Str = NULL;
	char		*sFin_Str = NULL;
	int			i = 0;
	
	if (sRet_Str = strstr(sIn, sCmd)) {							//Cherche la commande dans le fichier
		sIn = sRet_Str + strlen(sCmd);							//sIn "saute" la commande
		if (sDeb_Str = strstr(sIn, sBalise_D)) {				//Cherche la premiere balise
			sDeb_Str += strlen(sBalise_D);
			sIn = sDeb_Str;										//sIn "saute" la balise
			if (IsNumeric) {									//Si l'argument est IsNumeric > 0 alors rechercher les infos "numeriques"
				while (iIsNumeric(*sIn)) {						//Tant que les caracteres sont numeriques; les recuperer...
					sCmdFound[iNum_Cmd][i++] = sIn[0];
					sIn++;
				}
			} else {											//Si les données a recuperer ne sont pas numeriques
				if (sFin_Str = strstr(sIn, sBalise_E)) {		//Recherche de la balise de fin
					while (sFin_Str - sDeb_Str) {				
						sCmdFound[iNum_Cmd][i++] = sDeb_Str[0];	//Recuperation des infos
						sDeb_Str++;
					}
				}
			}
            sCmdFound[iNum_Cmd][i] = 0;
		}
	}

    return sIn;

}

//Teste si le caractere en argument est numerique ou pas
int iIsNumeric(char cInt)
{
	if (cInt >= '0' && cInt <='9') {		
		return SUCCESS;
	}
	return FAIL;
}




 Conclusion

C un code compilé avec VC.net, mais doit etre compatible avec gcc ou vc6, j'ai pas testé...C bien sur un code avec Winsock...
J'attends des remarques sur le prog lui mm, mais plus precisement sur la fonction sSearchIn et encore plu particulierement des boucles While, car je ne sais pas si la maniere dont j'ai traité le pb est bien, ou tres lente, enfin je veux savoir si ce ke j'ai fait est correct ou totalement a revoir...

Mettez des commentaires plz !!

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • winsock.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 198 octets
  • winsock.ncbTélécharger ce fichier [Réservé aux membres club]35 840 octets
  • winsock.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
  • winsock.slnTélécharger ce fichier [Réservé aux membres club]Voir ce fichier903 octets
  • winsock.vcprojTélécharger ce fichier [Réservé aux membres club]3 982 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip LISTVIEW PATHFINDING (WIN32)
Source avec Zip Source avec une capture PANNEAU LUMINEUX (WIN32)
Source avec Zip NOMBRE NARCISSIQUE (WIN32, ASM)
Source avec Zip MODIFIER ICONE REPERTOIRE [C][WIN32]
Source avec Zip Source avec une capture VERSION WINDOWS

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

Commentaires et avis

Commentaire de neo_00110010101 le 30/05/2004 21:20:57

3 erreurs :

ligne 174 : sLine = calloc(4608, sizeof(char));
&gt;&gt; '=' : cannot convert from 'void *' to 'char *'

ligne 217 : while (iIsNumeric(*sIn)) {
&gt;&gt; 'iIsNumeric' : undeclared identifier

ligne 238 : {
&gt;&gt; 'iIsNumeric' : redefinition; different type modifiers

Je conçois bien-sûr que cela peut venir de moi !

Commentaire de neo_00110010101 le 30/05/2004 21:22:33

J'oubliais le plus important : essai fait avec Visual C++ 6.0

Commentaire de AlexMAN le 30/05/2004 21:43:49

les 2dernieres erreurs sont des oublis de ma part, je n'ai pas rectifié la definition de la fonction IsNumeric, jV le faire...
Pour ce ki est de la 1ere erreur, tente un transtypage (cast) du style :
sLine = (char *) calloc(4608, sizeof(char));
Mais etant donné ke je l'ai ecris en C, ce genre de cast n'est pas obligatoire...
ENfin, jV rectifier cette erreur de definition ...merci neo de me l'avoir fait remarqué...

Commentaire de neo_00110010101 le 30/05/2004 22:07:48

Tout marche impeccable (bien que je n'habite pas à Nice) ^^
Par contre voici un léger problème : les caractères "spéciaux"

ligne 67 : printf("Initialisation de winsock effectuée...\n");
va donner : "effectuUe" avec un accent sur le U

ligne 85 : printf("Connexion avec le serveur établie...\n");
va donner : "Utablie" avec un accent sur le U

Dans ce cas utilise le code ASCII :
printf("Initialisation de winsock effectuée...\n");
devient :
printf("Initialisation de winsock effectu\202e...\n");
tout comme :
printf("Connexion avec le serveur \202tablie...\n");
printf("M\202t\202o a Nimes : \n");
sprintf(sSearch[i], "Temp\202rature : %s Degr\202s C" , sCmdFound[i]);
sprintf(sSearch[i], "Temp. ressentie : %s Degr\202s C", sCmdFound[i]);
sprintf(sSearch[i], "Point de ros\202e : %s°C", sCmdFound[i]);
sprintf(sSearch[i], "Humidit\202 : %s%%" , sCmdFound[i]);
sprintf(sSearch[i], "Visibilit\202 : %s km", sCmdFound[i]);
sprintf(sSearch[i], "Pression barom\202trique : %s", sCmdFound[i]);

Par contre il reste le problème du "à" (météo à Nimes et vent à -- km/h)
et du "°C"
il y a aussi un problème pour la pression barométrique.

Commentaire de neo_00110010101 le 30/05/2004 22:14:51

bon alors voilà :
le "à" se fait avec \205
le "î" se fait avec \214 (pour Nîmes ?)
par contre je ne trouve pas le symbole "°"
et je ne comprend pas ce que tu veux afficher avec la pression barométrique.

Commentaire de Kirua le 31/05/2004 01:13:25

en général l'opposé de numérique c'est analogique, c'est ça le mot que tu cherches?

Commentaire de AlexMAN le 31/05/2004 09:29:32

La pression barometrique a un ptit pb, c vrai, mais jne comprends pas :
dans le fichier ou sont conservées les infos, il n'y a pas ce 'à' entre le premier chiffre et les 3autres, mais lorske je recupere les donnees de ce fichier dans un variable, ben ce 'à' apparait, si quelqu'un a une idée sur le pourkoi du comment...
Voila, merci neo d'autant d'interesser a ma source, enfin je sais pas si c un interet mais au moins tu cherche a corriger les bugs, merci...

Commentaire de neo_00110010101 le 31/05/2004 09:33:57

mouais, tu aurais pu nommer ton fichier (qui se trouve dans C:\) autrement : "fuck.htm" ^_^

Sinon j'ai remarqué que ce problème, c'est juste un espace qui ne passe pas en console ...

1 020,0 millibars sera 1à020,0 millibars ...
Peut-être qu'il existe un code ASCII qui créé un espace =)

Commentaire de AlexMAN le 31/05/2004 11:11:36

uè dsl pour le fichier fuck.htm, c'est une habitude, enfin un manque d'inspiration de ma part pour trouver le nom de certains objets (c vrai kil fo bocou d'inspiration...) , pour le code ascii de l'espace, c 32 mais j'avais la flemme de decortiquer la chaine pour remplacer le à par un espace (à = code ascii 135)...
Voila, merci encore neo...

Commentaire de neo_00110010101 le 31/05/2004 12:44:44

hehe tu aurais pu trouver autre chose ! comme truc, test, source ...

Pourquoi tu ne mets pas à jour ta source ? ce serait parfait ! sinon j'ai trouvé 205 pour "à" bizarre ... car 35 ressemble à deux flèches ...

Commentaire de neo_00110010101 le 31/05/2004 13:23:55

Ce n'est que maintenant que je viens de me rendre compte de ma petite faute : je voulais dire :

j'ai trouvé 205 pour "à" bizarre ... car 135 c'est le caractère "]"
Quant à l'espace, le code 32 me fait une petite flèche vers la droite.

Commentaire de Kirua le 31/05/2004 14:32:05

32 c'est la valeur décimale de l'espace, en hexa ça donne 20

Commentaire de LordBob le 31/05/2004 16:24:42

moi j'aime beaucoup cette source (et puis habitant à Nîmes moi meme, elle est faite pour moi)... en plus elle m'ai très instructive... je cherchais à faire quelque chose comme ça et la bah j'ai un exemple pour me remettre dedans... c'est vrai qu'il y a quelques bug "d'orthographe" (des caractères qui apparaissent mal...) mais bon la source en elle meme est bien, seulement je regrette que certaines parties du code soit ne soit pas/peu commentée !!!

Commentaire de AlexMAN le 01/06/2004 07:32:02

C vrai ke nivo commentaire, j'ai été un peu "pingre", mais allez, jsui motivé et ce matin je mets ma source a jour...On va essayer d'eviter tout "bug d'orthographe", et puis jV aussi commencer la creation d'une fenetre (ou boite de dialogue je sais pas encore) pour afficher les infos trouvé et aussi les images...
Merci LordBob...

Commentaire de AlexMAN le 01/06/2004 07:32:30

C vrai ke nivo commentaire, j'ai été un peu "pingre", mais allez, jsui motivé et ce matin je mets ma source a jour...On va essayer d'eviter tout "bug d'orthographe", et puis jV aussi commencer la creation d'une fenetre (ou boite de dialogue je sais pas encore) pour afficher les infos trouvé et aussi les images...
Merci LordBob...

Commentaire de AlexMAN le 01/06/2004 08:17:58

Ca y est, le code sur la page et dans le zip a été mis a jour, regardez plutot le zip pour les commentaires parce que sur le site, c assez incomprehensible...Il reste toujours le bug du 'ò' dans la commande Vent, et du 'à' dans la commande Pression Barometrique, mais bon, c pas vraiment important...Voila, a bientot pour la version Windows !

Commentaire de sebman le 05/06/2004 02:02:29

Salut chapeau bas pour ta source mais elle ne veut pas marché chez wam
Mon VCpp6 me dit:
g:\programmation\c++\brouillon\meteo\winsock.c(219) : warning C4013: 'iIsNumeric' undefined; assuming extern returning int

kekifoke je fasse, Merci d'avance

Commentaire de sebman le 05/06/2004 02:03:18

Salut chapeau bas pour ta source mais elle ne veut pas marché chez wam
Mon VCpp6 me dit:
g:\programmation\c++\brouillon\meteo\winsock.c(219) : warning C4013: 'iIsNumeric' undefined; assuming extern returning int

kekifoke je fasse, Merci d'avance

Commentaire de AlexMAN le 05/06/2004 02:17:53

Vraiment dsl, j'ai reposté la source commentée mais avec le mm bug k'o debut...J'ai corrigé le code et le zip...encore dsl

++

Commentaire de sebman le 05/06/2004 03:02:11

Super Mega dla Balle !!!!!!!!
Le code pour
Paris------&gt; FRXX0076
Nantes----&gt; FRXX0072
Lorient ---&gt;FRXX0054

Commentaire de Kirua le 05/06/2004 12:31:49

41% d'humidité à Nîmes, mais c'est horrible ;-)
compilation sans problème

Commentaire de yannthegamer le 24/07/2004 14:18:01

et comment on obtient la meteo d'une autre ville??

Commentaire de sebman le 24/07/2004 23:13:31

www.singerscreations.com
weather watcher

Logiciel dispo sur telecharger.com ou
clubic.com ou download.com

Commentaire de AlexMAN le 26/09/2004 19:35:12

Dites, chez moi ca marche plus, chez vous ?

Commentaire de neo_00110010101 le 26/09/2004 20:35:47

je n'ai plus rien après "connexion avec le serveur établie..."

A mon avis ça vient de là justement ... le problème doit venir de là où tu "prends" les données

Commentaire de Gefkuz le 09/10/2005 18:41:35

Le soft n'arrive pas a telecharger la bonne page.....

Commentaire de victorcoasne le 15/06/2007 18:19:12

Tu fais quoi si le site te renvoi ta météo en gzip ?
Voir : "Accept -Encoding: gzip , deflate"

Commentaire de zebulon88 le 27/02/2009 00:00:59

merci pour ce programme très instructif

je dois faire un truc similaire mais ma requete HTTP est en POST, afin de télécharger un fichier txt sur un site Web

Comment écrire proprement une requête POST à la place de GET? car les paramètres à envoyer de la requete sont dans le corps du paquet.

Commentaire de victorcoasne le 27/02/2009 12:22:05

Tu peux lire la norme RFC2616 qui défini le protocole HTTP/1.1 : http://www.ietf.org/rfc/rfc2616.txt

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales