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

C Discussion :

Acceder a page web avec commande HTTP en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut Acceder a page web avec commande HTTP en c
    Bonjour,
    J’ai une page sur le serveur freehostia.com en PHP qui fait l’envoi du email, je voulais faire un programme en c pour interroger cette page.
    Avec un navigateur j’accède a mon site cette page est nommé index.php elle fait directement un envoi d’email au GMAIL
    Mais je voulais faire cette chose en C sans apparaitre le navigateur.
    J’ai fais une recherche j’ai trouvé qu’il faut connecter au serveur avec une socket,
    Jusque la c’est simple mais le problème est d’interroger la page, j’ai trouvé qu’il faut envoyer une commande http
    Questions :
    1 quelle commande j’utilisé
    2 comment savoir la version de http de serveur
    3 si vous avez un petit code en c c’est mieux

    Configuration: Windows XP
    Firefox 2.0.0.16

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Voici un exemple pour unixoïde qui doit être facilement transposable pour Windows (mettre les bons fichiers d'entêtes, linker avec la bonne bibliothèque et WSAstartup()...)

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
     
    #define HOST "c.developpez.com"
    #define PORT 80
    #define FILE "/"
     
    int main (void)
    {
      struct hostent *host_address = gethostbyname (HOST);
     
      if (host_address != NULL)
      {
          int socket_id = socket (PF_INET, SOCK_STREAM, 0);
     
          if (socket_id != -1)
          {
            struct sockaddr_in sockname;
     
            sockname.sin_family = (sa_family_t) host_address->h_addrtype;
            sockname.sin_port = htons (PORT);
            memcpy (&sockname.sin_addr.s_addr, host_address->h_addr,
                    (size_t)host_address->h_length);
     
            if (connect (socket_id, (struct sockaddr *) &sockname,
                          sizeof sockname) != -1)
            {
                char str[1024];
                int l;
     
                write (socket_id, "GET ", sizeof "GET " - 1);
                write (socket_id, FILE, sizeof FILE - 1);
                write (socket_id, " HTTP/1.0\r\nHost: ",
                      sizeof " HTTP/1.0\r\nHost: " - 1);
                write (socket_id, HOST, sizeof HOST - 1);
                write (socket_id, "\r\n\r\n", sizeof "\r\n\r\n" - 1);
     
                while ((l = read (socket_id, str, sizeof str - 1)))
                {
                  str[l] = 0;
                  printf ("%s", str);
                  fflush (stdout);
                }
     
                close (socket_id), socket_id = -1;
            }
            else                  /* connect () */
            {
                perror ("connect ()");
            }
          }
          else                      /* socket () */
          {
            perror ("socket ()");
          }
      }
      else                        /* gethostbyname () */
      {
          perror ("gethostbyname ()");
      }
     
      return 0;
    }

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut Un problème
    Merci pour votre réponse
    J’ai adapté le code comme :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <string.h>
    #include <unistd.h>
     
     
    #define HOST "nsnous1.freehostia.com"
    #define PORT 80
    #define FILE "/"
     
    int main (void)
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);      
     
      struct hostent *host_address = gethostbyname (HOST);
     
      if (host_address != NULL)
      {
          int socket_id = socket (AF_INET, SOCK_STREAM, 0);
     
          if (socket_id != -1)
          {
            struct sockaddr_in sockname;
     
            sockname.sin_family = (AF_INET);
            host_address->h_addrtype;
            sockname.sin_port = htons (PORT);
            memcpy (&sockname.sin_addr.s_addr,host_address->h_addr,(size_t)host_address->h_length);
     
            if (connect (socket_id, (struct sockaddr *) &sockname,sizeof sockname) != -1)
            {
                char str[1024];
                int l;
     
                write (socket_id, "GET ", sizeof "GET " - 1);
                write (socket_id, FILE, sizeof FILE - 1);
                write (socket_id, " HTTP/1.0\r\nHOST: ",sizeof " HTTP/1.0\r\nHOST:" - 1);
                write (socket_id, HOST, sizeof HOST - 1);
                write (socket_id, "\r\n\r\n", sizeof "\r\n\r\n" - 1);
     
                while ((l = read(socket_id, str, sizeof str - 1)))
                {
                str[l] = 0;
                  printf ("%s", str);
                  fflush (stdout);
                  }
                close (socket_id), socket_id = -1;
            }
            else                  /* connect () */
            {
                perror ("connect ()");
            }
          }
          else                      /* socket () */
          {
            perror ("socket ()");
          }
      }
      else                        /* gethostbyname () */
      {
          perror ("gethostbyname ()");
      }
     
      return 0;
    }
    Mais je rentre dans une boucle infinie il s’affiche
    Des choses bizarres

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Sous Windows un socket n'est pas un file descriptor mais un 'SOCKET'. On n'utilise donc pas les fonctions read et write mais recv et send. On ne le ferme pas non plus avec close mais avec closesocket (une invention de Windows car les sockets ici ne sont pas de file descriptors. Sous UNIX c'est tout simplement close).

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634

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

Discussions similaires

  1. acceder au contenu d'une page web avec VB6
    Par maryo dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 12/10/2009, 11h09
  2. Réponses: 4
    Dernier message: 05/05/2006, 13h41
  3. Ouvrir une page Web avec le navigateur
    Par BB85_TIGRIS dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 17/12/2005, 09h45
  4. Son dans une page Web avec Firefox
    Par diod dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 02/12/2005, 17h49
  5. Réponses: 15
    Dernier message: 15/11/2005, 17h33

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