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

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 22
    Points
    22
    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 émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    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 à l'essai
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 22
    Points
    22
    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 éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    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
    Points : 13 017
    Points
    13 017

  6. #6
    Membre à l'essai
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut le probleme est résolu!

    voila le code
    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #include <winsock2.h>
    #define IP "69.80.229.131"
    #define PORT 80
     
    int main(int argc, char *argv[])
    {
        char bufferRecv[50];    
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKET sock = sock = socket(AF_INET, SOCK_STREAM, 0);
     
     
            SOCKADDR_IN sin;
            sin.sin_addr.s_addr    = inet_addr(IP);
            sin.sin_family    = AF_INET;
            sin.sin_port    = htons(PORT);
     
            if( connect(sock, (SOCKADDR *)&sin, sizeof sin) != SOCKET_ERROR )
            {
                printf(":-) connecton  au serveur ok...\n\n");
                if(send(sock,"GET /index.php HTTP/1.0\r\nHOST: nsnous1.freehostia.com\r\n\r\n", strlen("GET /index.php HTTP/1.0\r\nHOST: nsnous1.freehostia.com\r\n\r\n"), 0)!=SOCKET_ERROR){
                  printf("   requet get envoer ok               ");
                  if(recv(sock, bufferRecv, sizeof(bufferRecv)-1, 0)!=SOCKET_ERROR){
                   printf(":-) reponse  ok...\n\n");
                   printf(">>>> SERVER DIT: %s\n",bufferRecv);
     
                  }
                  }else {
                        printf("requete get non envoyez ");
                        }                                      
     
     
                 } else{
                      printf(":-) connection au serveur non réussi...\n\n");
                      }
     
     
     
        closesocket(sock);
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Le smiley sur "connexion au serveur non réussie" devrait être triste, non?

  8. #8
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    Ca m'a l'air très bien fait, à part les arguments de main qui sont déclarés et pourtant pas utilisés ... (juste pour critiquer un peu ). A par ça, j'aime pas trop le dernier printf. A ta place j'aurais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(":-( connection au serveur non reussi...\n\n");


    Citation Envoyé par Médinoc Voir le message
    Le smiley sur "connexion au serveur non réussie" devrait être triste, non?
    +1000.

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Melem Voir le message
    Ca m'a l'air très bien fait, à part les arguments de main qui sont déclarés et pourtant pas utilisés ... (juste pour critiquer un peu ). A par ça, j'aime pas trop le dernier printf. A ta place j'aurais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(":-( connection au serveur non reussi...\n\n");


    +1000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    puts (":-( connection au serveur non reussi...\n");

+ 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