IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Récupérer une page internet en C


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Points : 26
    Points
    26
    Par défaut Récupérer une page internet en C
    Bonjours tout le monde !

    Comme le titre le dis, je voudrais réaliser un programme qui me permet de récupérer le contenu d'une page internet et ensuite de l'enregistrer dans un fichier.

    Comme vous le savez sans doute, j'ai des soucis dont voici un bref aperçu :
    1) Je ne sais pas par quel protocole internet les serveurs http sont communiquants (TCP/IP connecté, non connecté; UDP; ou autre...)

    2) j'ai essayé une partie de code en TCP/IP connecté, je n'arrive pas a me connecté au serveur souhaité.

    3) J'ai essayé le TCP/IP non connecté, il me donne une erreur #10022 (bon j'admets ne pas savoir si vraiment il y a un mode tcp non connecté...)

    4) Lorsque je suis en UDP, le programme s'arrête dès qu'il a envoyé les données et ne fait plus rien.

    5) lorsque je regarde ce qui transite sur mon réseau, aucune données ne part de mon ordi lorsque je lance mon programme.

    pour ceux qui veulent du code, le voici :
    Je suis désolé si mon code n'est pas super et comporte des erreurs grossières, je ne suis vraiment pas spécialiste du réseau en c... merci pour votre compréhension !

    Pour tout ce qui est création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    if (WSAStartup (MAKEWORD(2, 0), &m_WSAData) != 0)
    {
    	//if (OpenUDPtoServer(m_Port, &m_Socket) == ECOMM_WSASTARTUP)
    	{}
    	else
    	{
    		m_SocketType = comm;
    		strcpy	(m_HostName, Host);
    		m_Port = port;
    		TempIp = HostNametoIPv4 (Host);
    		memcpy (m_IPv4, TempIp, strlen(TempIp)+1);
    		m_ServerAddress.sin_family = 	AF_INET;
    		m_ServerAddress.sin_port =		htons(m_Port); //	htons ()
    		if (m_ServerAddress.sin_addr.s_addr = inet_addr (m_IPv4) != 0)
    		{	InitSocket();	}
    		else
    		{	printf	("[IP ADDRESS] - Not valid.\n");	}
            }
    }
    Pour tout ce qui est connexion/initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    if (m_SocketType == E_COMTYPE_TCP_CONNECTED || m_SocketType == E_COMTYPE_TCP_NCONNECTED)
    {
    	if ((m_Socket = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
    	{
    		if (m_SocketType == E_COMTYPE_TCP_CONNECTED)
    		{
    			printf	("Connecting to %s\nOn port: %d\nProtocol TCP/IP\n", m_IPv4, m_Port);
    		//	if (inet_pton (AF_INET, m_IPv4, &m_ServerAddress.sin_addr) <= 0)
    			if (connect (m_Socket, (struct sockaddr *) &m_ServerAddress, sizeof (m_ServerAddress)) == SOCKET_ERROR)
    			{	printf	("[SOCKET] - Problem while connection to server.\n");	}
    		//	No error
    			else
    			{	printf	("[SOCKET] - Connected to server.\n");	}
    		}
    		else
    		{	printf	("[PROTOCOL] - TCP/IP not connected.\n");	}
    	}
    	else
    	{	printf	("[SOCKET] - Problem while socket() : invalid socket.\n");	}
    }
    else
    {
    	printf	("Protocol UDP\n");
    	m_Socket = socket	(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    	if (m_Socket == INVALID_SOCKET)
    	{	printf	("[SOCKET] - Error while socket().\n");	}
    }
    Pour tout ce qui est transmission/réception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    char	URL[1024], Content[1024];
    int		ReceivedBytes, SendedBytes, Size;
    sprintf	(URL, "GET %s HTTP/1.1\r\nHost: %s\r\nAccept: text/html\r\nContent-Type: text/html\r\nConnection: keep-alive\r\n", url, m_HostName);
    Size = sizeof(m_ServerAddress);
    //	printf	("%s", URL);
    if (m_Socket != INVALID_SOCKET)
    {
    	switch (m_SocketType)
    	{
    		case E_COMTYPE_TCP_CONNECTED :
    			SendedBytes = send	(m_Socket, URL, sizeof(URL)+1, 0);
    			break;
    		case E_COMTYPE_TCP_NCONNECTED :
    		case E_COMTYPE_UDP :
    			SendedBytes = sendto	(m_Socket, URL, sizeof(URL)+1, 0, (sockaddr *) &m_ServerAddress, sizeof(m_ServerAddress));
    			break;
    	}
    	if (SendedBytes >= 0)
    	{	printf	("[SENDING] - %d Bytes sended.\n", SendedBytes);	}
    	else
    	{	printf	("[SENDING] - Problem while sending message :\n%s", URL);	}
    	if (m_SocketType == E_COMTYPE_TCP_CONNECTED)
    	{	ReceivedBytes = recv	(m_Socket, Content, 1024, 0);	}
    	else
    	{	ReceivedBytes = recvfrom(m_Socket, Content, 1024, 0, (sockaddr *) &m_ServerAddress, &Size);	}
    	if (ReceivedBytes <= 0)
    	{
    		printf	("Error #%d\n", WSAGetLastError ());
    		printf	("[INFO] - Size of structur : %d, Size of content : %d\n", sizeof (sockaddr), sizeof (m_ServerAddress));
    	}
    	else
    	{	printf	("[%d] - %s\n", ReceivedBytes, Content);	}
    }
    else
    {	printf	("[SOCKET] - Error invalid socket\n");	}
    Voilà, je vous remercie d'avance pour votre aide et j'attends avec impatience vos réponses !

    A bientôt !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    La communoication avec un serveur WWW se fait en TCP (donc mode connecté). Le port destination (donc le port du serveur) est très très souvent le port 80.

    Si tu es en entreprise, il faudra peut être aussi gérer la problèmatique des proxy.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup ram-0000 !
    ça m'aide déjà beaucoup !

    J'ai tout de même un problème lors de la tentative de connexion au serveur : il tente de s'y connecter mais il me dit selon mon code :

    [SOCKET] - Problem while connecting to server.
    Je ne sais pas à quoi cela est du, pourrais-tu éventuellement me dire les modifications à apporter a mon code afin de le rendre fonctionnel ?

    Merci !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Re!

    Alors c'est réglé, j'ai trouvé mon problème et maintenant, je reçois la réponse du serveur ainsi que le contenu de la page demandée !

    Merci pour ton aide ram-0000 !

    Pour ceux qui sont intéressé, le code posté précédemment est correct mais une modification s'impose dans la création dont voici le nouveau code (Vous trouverez les modifications en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    char * TempIp;
    if (Host != '\0')
    {
    	if (WSAStartup (MAKEWORD(2, 0), &m_WSAData) != 0)
    	{}
    	else
    	{
    		m_SocketType = comm;
    		strcpy	(m_HostName, Host);
    		m_Port = port;
    		TempIp = HostNametoIPv4 (Host);
    		memcpy (m_IPv4, TempIp, strlen(TempIp)+1);
    		m_ServerAddress.sin_family =		AF_INET;
    		m_ServerAddress.sin_port =		htons(m_Port);
    		m_ServerAddress.sin_addr.s_addr =	inet_addr (m_IPv4);
    		if (m_ServerAddress.sin_addr.s_addr != 0)
    		{	InitSocket();	}
    		else
    		{	printf	("[IP ADDRESS] - Not valid.\n");	}
    	}
    }
    J'ai oublié de modifier aussi le contenu de la requête envoyée au serveur HTTP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprintf	(URL, "GET %s HTTP/1.1\r\nHost: %s\r\nAccept: text/html\r\nContent-Type: text/html\r\nConnection: keep-alive\r\n\r\n", url, m_HostName);
    La requête doit se terminé par deux lignes vides. Ceci est du au fait que lorsque le serveur nous renvoie le contenu de la page, le message venant du serveur commence par une série d'informations puis sépare le contenu de la page qui suit ses informations, par une ligne vide.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour.
    J'aimerais savoir la bibliothèque à inclure parce que "E_COMTYPE_TCP_CONNECTED", ou encore "E_COMTYPE_TCP_NCONNECTED" ne se trouvent pas dans la Winsock 2, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Récupérer une valeur dans une page internet
    Par Richard_Rahl dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2008, 16h10
  2. Récupérer une page internet dans un fichier texte
    Par Sakapatate dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 15/06/2007, 10h06
  3. Récupérer une page Internet "lourde"
    Par Richard_Rahl dans le forum Langage
    Réponses: 7
    Dernier message: 28/04/2007, 22h24
  4. Récupérer du texte d'une page internet
    Par PorkyFighter dans le forum C
    Réponses: 2
    Dernier message: 11/11/2006, 21h55
  5. Comment récupérer une info d'une page internet ?
    Par Magicien d'Oz dans le forum Réseau
    Réponses: 3
    Dernier message: 12/10/2005, 07h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo