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 :

Probleme requete HTTP


Sujet :

Réseau C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut Probleme requete HTTP
    Salut à tous.

    J'essaie de programmer un petit client http à base de sockets ( No Wininet )

    Mon prog est structuré comme cela :

    Connection tcp à un serveur dont l'ip est rentré dans la console.
    Envoi d'une requète preformatée au serveur ( pour tester ).
    Reception des données.

    En sniffant les données qui transitent avec wireshark je me rend compte que la connection se passent bien, mais que ça s'arrète là ^^ pas d'envoit au serveur et pas de reception.

    voici 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
    int main(int argc, char *argv[])
    {
        char ip[16];
        char reply[1024];
        char request[1024];
     
        int port;
        int nbsend,nbreceive;
     
        SOCKET Socket;
        SOCKADDR_IN infodest;
     
        printf("Entrez Ip \n\n");
        scanf("%s",ip);
     
        printf("Entrez Port \n\n");
        scanf("%d",&port);
     
        initw();
        create_socket(Socket);
     
        if( connection_tcp(ip,port,Socket,infodest) )printf("\nConnecte au serveur %s sur le port %d\n",ip,port);
     
        // ENVOIT D'UNE REQUETE //
     
        strcpy(request,"GET / HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1\r\nAccept: text/html\r\nAccept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n");
     
        nbsend=send(Socket,request,strlen(request),0);
     
     
        nbreceive=recv(Socket,reply,1024,0);
     
        system("pause");
     
        printf("%s",reply);
    }
    Merci à ceux qui s'interesseront à ce pauvre code

    vive la prog reseaux et vive le c

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tonymontana Voir le message
    Merci à ceux qui s'interesseront à ce pauvre code
    Ton code est incomplet.
    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
     
    -------------- Build: Debug in hello ---------------
     
    [ 50.0%] Compiling: main.c
    [100.0%] Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\main.c:10: error: `SOCKET' undeclared (first use in this function)
    C:\dev\hello\main.c:10: error: (Each undeclared identifier is reported only once
    C:\dev\hello\main.c:10: error: for each function it appears in.)
    C:\dev\hello\main.c:10: error: syntax error before "Socket"
    C:\dev\hello\main.c:11: error: `SOCKADDR_IN' undeclared (first use in this function)
    C:\dev\hello\main.c:13: warning: implicit declaration of function `printf'
    C:\dev\hello\main.c:14: warning: implicit declaration of function `scanf'
    C:\dev\hello\main.c:19: warning: implicit declaration of function `initw'
    C:\dev\hello\main.c:20: warning: implicit declaration of function `create_socket'
    C:\dev\hello\main.c:20: error: `Socket' undeclared (first use in this function)
    C:\dev\hello\main.c:22: warning: implicit declaration of function `connection_tcp'
    C:\dev\hello\main.c:22: error: `infodest' undeclared (first use in this function)
    C:\dev\hello\main.c:26: warning: implicit declaration of function `strcpy'
    C:\dev\hello\main.c:28: warning: implicit declaration of function `send'
    C:\dev\hello\main.c:28: warning: implicit declaration of function `strlen'
    C:\dev\hello\main.c:31: warning: implicit declaration of function `recv'
    C:\dev\hello\main.c:33: warning: implicit declaration of function `system'
    C:\dev\hello\main.c: At top level:
    C:\dev\hello\main.c:1: warning: unused parameter 'argc'
    C:\dev\hello\main.c:1: warning: unused parameter 'argv'
    Process terminated with status 1 (0 minutes, 0 seconds)
    7 errors, 12 warnings
    Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        SOCKET Socket;
    <...>    
        create_socket(Socket);
    N'a aucune chance de fonctionner

    C'est soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        create_socket(&Socket);
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Socket = create_socket();
    (ma préférence).

    Je ne connais pas bien le protocole http, mais il semblerait qu'il y ait 2 erreurs :
    - Il faut mettre HTTP/1.0
    - il faut terminer la requete par 2 crlf.

    Ca donne ceci sur mon routeur bon à tout ! (telnet, ftp, http)
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    #include <winsock2.h>
    #include <stdio.h>
    #include <assert.h>
     
    static void initw (void)
    {
       WSADATA wsa_data;
       WSAStartup (MAKEWORD (2, 2), &wsa_data);
    }
     
    static void endw (void)
    {
       WSACleanup ();
    }
     
    SOCKET create_socket_tcp (void)
    {
       /* open a socket in TCP/IP mode. */
       return socket (AF_INET, SOCK_STREAM, 0);
    }
     
    int connection_tcp (SOCKET sock, char const *ip, unsigned port)
    {
       int err = 0;
       /* connection data */
       SOCKADDR_IN sin = { 0 };
     
       /* server IP address */
       sin.sin_addr.s_addr = inet_addr (ip);
     
       /* protocol family (IP) */
       sin.sin_family = AF_INET;
     
       /* destination port */
       sin.sin_port = htons (port);
     
       /* client connection request (blocking) */
       printf ("waiting for a connection to the server on %s:%d...\n", ip, port);
       {
          int sock_err = connect (sock, (SOCKADDR *) & sin, sizeof sin);
     
          if (sock_err != SOCKET_ERROR)
          {
             printf ("client connected with socket %d from %s:%d\n",
                     sock, inet_ntoa (sin.sin_addr), htons (sin.sin_port));
          }
          else
          {
             err = 1;
          }
       }
       return 0;
    }
     
    static int receive_txt (SOCKET sock)
    {
       int err = 0;
       char buf[1024];
       int n = recv (sock, buf, sizeof buf - 1, 0);
     
       if (n > 0)
       {
          buf[n] = 0;
          printf ("%s", buf);
          fflush (stdout);
       }
       else
       {
          printf ("recv %s\n", n == 0 ? "disconnected" : "error");
          err = 1;
       }
       return err;
    }
     
    static void send_txt (SOCKET sock, char const *txt)
    {
       char buf[1024];
       /* commande FTP terminee par CR LF */
       int n = sprintf (buf, "%s\r\n", txt);
       assert (n < (int) (sizeof buf));
     
       n = send (sock, buf, strlen (buf), 0);
     
       if (n > 0)
       {
       }
       else
       {
          printf ("send %s\n", n == 0 ? "disconnected" : "error");
       }
    }
     
     
    int main (void)
    {
       char ip[sizeof "xxx.xxx.xxx.xxx"] = "192.168.0.1";
       int port = 80;
     
    #if 0
       printf ("Entrez Ip \n\n");
       scanf ("%s", ip);
     
       printf ("Entrez Port \n\n");
       scanf ("%d", &port);
    #endif
     
       initw ();
       SOCKET Socket = create_socket_tcp ();
       int err = connection_tcp (Socket, ip, port);
       if (!err)
       {
          printf ("\nConnecte au serveur %s sur le port %d\n", ip, port);
     
          /* envoi d'une requete basique */
     
          send_txt (Socket, "GET / HTTP 1.0\n");
     
          err = receive_txt (Socket);
     
       }
       closesocket (Socket);
       endw ();
     
       return 0;
    }
    La réponse est normale, car l'accès est sécurisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    waiting for a connection to the server on 192.168.0.1:80...
    client connected with socket 68 from 192.168.0.1:80
     
    Connecte au serveur 192.168.0.1 sur le port 80
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Basic realm="MR314"
    Content-Type: text/html
    Server: ZyXEL-RomPager/3.02
     
     
    Process returned 0 (0x0)   execution time : 0.129 s
    Press any key to continue.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut
    Voici les fonctions que j'utilise :

    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
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <winsock2.h> // ne pas oublier d'ajouter -lws2_32 dans le linker de dev_c++
     
    int initw()
    {
        int erreur;
        WSADATA initialisation_win32;
     
        //RETOURNE 0 SI REUSSIT 
        erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
     
    	if (erreur!=0)
    	{
    		return(WSAGetLastError());
        }
    	else
    	{
            return(1);
        }
    }
     
    int create_socket(SOCKET &Socket)
    {
        // RETOURNE -1 EN CAS D'ERREUR  sinon RETOURNE UN DESCRIPTEUR DE SOCKET
        Socket=socket(AF_INET,SOCK_STREAM,0);
        return(WSAGetLastError());
    }
     
    int connection_tcp(char* ip,int port,SOCKET &Socket, SOCKADDR_IN infodest)
    {
        int erreur;
     
        printf("Tentative de connexion a %s sur le port %d\n",ip,port);
     
        infodest.sin_family=AF_INET;
        infodest.sin_addr.s_addr=inet_addr(ip);   
        infodest.sin_port=htons(port); 
     
    	// RETOURNE 0 SI OK, -1 SINON
     
        erreur=connect(Socket,(struct sockaddr*)&infodest,sizeof(infodest));
     
        if( erreur == 0 )
        {
            return(1);
        }
        else
        {
            return(erreur);
        } 
     
    }
    J'ai mis le passage par adresse dans le prototype de la fonction, et apparemment ça marche

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tonymontana Voir le message
    Voici les fonctions que j'utilise :

    <...>
    J'ai mis le passage par adresse dans le prototype de la fonction, et apparemment ça marche
    (C'est pas la peine de lever les yeux au ciel, c'est très impoli.)

    Ca n'existe pas en C. Tu fais du C++. Je déplace ?

  5. #5
    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
    int create_socket(SOCKET &Socket)
    ...
    J'ai mis le passage par adresse dans le prototype de la fonction, et apparemment ça marche
    C'est un passage par référence, ça n'existe pas en C. Si tu veux utiliser les références, il y a le forum C++. Sinon, fais comme Emmanuel te l'avait montré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nbreceive=recv(Socket,reply,1024,0);
     
    system("pause");
     
    printf("%s",reply);
    Et qui va mettre le '\0' dans reply ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut
    (C'est pas la peine de lever les yeux au ciel, c'est très impoli.)
    ce n'étais pas des yeux au ciel arroguant, mais plutot le smiley pas sur de lui ^^ don't worry .

    Ca n'existe pas en C. Tu fais du C++. Je déplace ?
    Détail dont on se fout complétement à mon avis. La logique reste C dans mon programme à mon avis, mais j'alie un peu les 2 languages c'est vrai.

    Et qui va mettre le '\0' dans reply ?
    nbreceive=recv(Socket,reply,1024,0);
    reply[nbreceive]='\0';
    printf("%s",reply);

    thanks

    Je ne connais pas bien le protocole http, mais il semblerait qu'il y ait 2 erreurs :
    - Il faut mettre HTTP/1.0
    - il faut terminer la requete par 2 crlf.
    Merci beaucoup pour ton aide, je vais tester ça.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tonymontana Voir le message
    ce n'étais pas des yeux au ciel arroguant, mais plutot le smiley pas sur de lui ^^ don't worry .



    Détail dont on se fout complétement à mon avis.
    Mon compilateur de s'en fout pas du tout.
    La logique reste C dans mon programme à mon avis,
    Si tu écris du pseudo-code, précise le.mais
    j'alie un peu les 2 languages c'est vrai.
    Pratique exécrable et dangereuse. Les règles du C et du C++ ne sont pas les mêmes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nbreceive=recv(Socket,reply,1024,0);
    reply[nbreceive]='\0';
    printf("%s",reply);
    Non. Si tu reçois 1024 bytes, tu n'as plus de place pour le 0 final. De plus, il faut traiter les erreurs...

    http://emmanuel-delahaye.developpez....eaux.htm#texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    nbreceive = recv (Socket, reply, 1024 - 1, 0);
    if (nbreceive > 0)
    {
       reply[nbreceive] = '\0';
       printf("%s",reply);
    }
    J'ai déjà donné un corrigé...

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

Discussions similaires

  1. Probleme J2E requete HTTP vers serveur tomcat sur internet.
    Par helpmeplzzz dans le forum Cloud Computing
    Réponses: 0
    Dernier message: 07/09/2013, 12h54
  2. [Wamp] probleme requete https
    Par Cedric G dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 01/06/2012, 15h26
  3. probleme Requete HTTP (post)
    Par Pyroclem dans le forum Débuter
    Réponses: 1
    Dernier message: 18/03/2009, 23h52
  4. Réponses: 3
    Dernier message: 17/05/2004, 17h28

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