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 :

client http avec socket


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Par défaut client http avec socket
    Bonjour,

    Je essaye actuellement de coder un petit client http.J arrive a me connecter au site, j envoie ensuite une requete "GET" pour recuperer le contenue de la page mais je ne recois rien !
    voici mon 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <windows.h>
     
    int main()
    {
        char requete[100] = {"GET index.html HTTP/1.0"};
        char *buff;
     
        buff = calloc(512,sizeof(char));
     
        WSADATA wsa;
        WSAStartup(MAKEWORD(2, 2), &wsa);
     
        SOCKET sock;
        SOCKADDR_IN sin;
     
        sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     
        sin.sin_addr.s_addr = inet_addr("209.85.147.103"); // google.fr
        sin.sin_family = AF_INET;
        sin.sin_port = htons(80);
     
        if(connect(sock,(SOCKADDR*)&sin,sizeof(sin)) != SOCKET_ERROR)
        {
            printf("connexion ok\n");
     
            if(send(sock,requete,sizeof(requete),0) != -1)
            {
                printf("Requete envoye!\n");
            }
     
            while(recv(sock,buff,sizeof(buff),0) != SOCKET_ERROR)
            {
                printf("%s",buff);
            }
        }
     
        closesocket(sock);
     
        WSACleanup();
     
        return 0;
    }
    Mon programme reste bloqué sur la fonction recv.
    Merci d'avance.

  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 : 62
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(send(sock,requete,sizeof(requete),0) != -1)
    sizeof(requete) vaut 4, il faut mettre strlen(requete)

    pareil pour le recv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(recv(sock,buff,sizeof(buff),0
    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Il faut en outre compléter ta requête avec deux retours à la ligne. Le premier pour valider la ligne que tu as écrite, et le second pour terminer ta requête par une ligne vide, nécessaire pour indiquer au serveur que tu as fini.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Par défaut
    Merci pour vos reponses.
    J ai modifier en fonction de vos infos mais ca ne fonctionne toujours pas.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <windows.h>
     
    int main()
    {
        char requete[100] = {"GET  HTTP/1.0  \n\n"};
        char *buff;
     
        buff = calloc(512,sizeof(char));
     
        WSADATA wsa;
        WSAStartup(MAKEWORD(2, 2), &wsa);
     
        SOCKET sock;
        SOCKADDR_IN sin;
     
        sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     
        sin.sin_addr.s_addr = inet_addr("209.85.229.147"); //google.fr
        sin.sin_family = AF_INET;
        sin.sin_port = htons(80);
     
        if(connect(sock,(SOCKADDR*)&sin,sizeof(sin)) != SOCKET_ERROR)
        {
            printf("connexion ok\n");
     
            if(send(sock,requete,strlen(requete),0) != -1)
            {
                printf("Requete envoye!\n");
            }
     
            while(recv(sock,buff,strlen(buff),0) != SOCKET_ERROR)
            {
                printf("%s",buff);
            }
        }
     
        closesocket(sock);
     
        WSACleanup();
     
        return 0;
    }

  5. #5
    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 : 62
    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
    Par défaut
    C'est le recv() qui va pas (faut dire que je t'ai un peu induit en erreur avec ma réponse pas tout à fait correcte).

    Tu alloues un buffer de réception de 512 octets avec calloc(). Il faut dans le recv() lui dire qu'il y a 512 octets disponibles. strlen(), c'est pour le send().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int size_buffer_recep = 512;
    char *buff = calloc(size_buffer_recep, sizeof(char));
    ...
    while(recv(sock, buff, size_buffer_recep, 0) != SOCKET_ERROR)
    Au fait, le code de retour de calloc(), cela se teste (même s'il y a peu de chance qu'il soit mauvais) autant prendre les bonnes habitudes.
    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
    .

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par ben83510 Voir le message
    Merci pour vos reponses.
    J ai modifier en fonction de vos infos mais ca ne fonctionne toujours pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main()
    {
        char requete[100] = {"GET  HTTP/1.0  \n\n"};
    }
    Cette fois-ci, c'est la requête elle-même qui n'est plus correcte. Tu as fait sauter le / entre GET et HTTP alors qu'il indique précisément ce que tu demandes à récupérer, et les espaces surnuméraires entre 1.0 et les \n\n ne doivent pas plaire au serveur non plus.

Discussions similaires

  1. HTTP avec sockets (langage C)
    Par fred_sell dans le forum Protocoles
    Réponses: 3
    Dernier message: 15/07/2013, 20h54
  2. [HF11] Client serveur avec Socket
    Par bakouly dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 30/06/2013, 21h51
  3. Un client irc avec socket et fork
    Par cybersplash dans le forum POSIX
    Réponses: 6
    Dernier message: 12/04/2007, 20h22
  4. application client/serveur avec les sockets
    Par baya1 dans le forum JBuilder
    Réponses: 1
    Dernier message: 24/02/2007, 15h37
  5. [SOCKET] connexion client serveur avec applet
    Par kaiser2003 dans le forum Applets
    Réponses: 2
    Dernier message: 06/10/2004, 22h32

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