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

Windows Discussion :

[WINSOCK] Problème recv


Sujet :

Windows

  1. #1
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut [WINSOCK] Problème recv
    Hello,

    j'ai fait un programme qui télécharge le code source d'une page web et ça marche plus ou moins. Par plus ou moins, je veux dire qu'il y a une boucle pour qu'il télécharge plusieurs pages, que la première fonctionne bien, mais qu'ensuite il me télécharge plus rien.

    Voila 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
    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
        debug("    \tCreation des WSA...");
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        debug("[OK]\tCreation des WSA...");
    
        debug("    \tCreation du SOCKET et SOCKADDR_IN");
        SOCKET sock;
        SOCKADDR_IN sin;
        debug("[OK]\tCreation du SOCKET et SOCKADDR_IN");
    
        debug("    \tInitialisation du socket et du sockaddr_in");
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
        sin.sin_addr.s_addr = 989209672; //inet_addr("72.36.246.58");
        sin.sin_family = AF_INET;
        sin.sin_port = htons(80); // port HTTP.
        debug("[OK]\tInitialisation du socket et du sockaddr_in");
    
        debug("    \tConnexion du socket");
        connect(sock, (SOCKADDR *)&sin, sizeof(sin)); // on se connecte sur le site web.
        debug("[OK]\tConnexion du socket");
    
    
        debug("    \tBoucle de telechargement des series");
        for (int i = 0; i < nombre_series; i++)
        {
            debug("    \tTravail sur la serie : " + series[i].get_name());
    
            debug("    \tCreation des variables locales de la serie");
            string source = "";
            string srequete = "";
            size_t requete_taille;
            debug("[OK]\tCreation des variables locales de la serie");
    
            debug("    \tEcriture de la requete GET en string");
            srequete = "GET " + series[i].get_url()  + " HTTP/1.0\r\n";
            srequete += "Host: tvrage.com\r\n";
            srequete += "Connection: close\r\n";
            srequete += "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
            srequete += "Accept: text/html;q=0.9,text/plain;q=0.8\r\n";
            srequete += "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
            srequete += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
            srequete += "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\r\n";
            srequete += "Referer: http://pozzyx.net/\r\n";
            srequete += "\r\n";
            debug("[OK]\tEcriture de la requete GET en string");
    
            debug("    \tConversion de la requete GET en char");
            requete_taille = srequete.size() + 1;
    
            char crequete[requete_taille];
            strncpy( crequete, srequete.c_str(), requete_taille );
            debug("[OK]\tConversion de la requete GET en char");
    
            debug("    \tEnvoi de la requete GET au serveur");
            send(sock, crequete, strlen(crequete), 0); // on envoie la requête HTTP.
            debug("[OK]\tEnvoi de la requete GET au serveur");
    
            debug("    \tReception de la source");
            int data;
            do
            {
                char buffer[1024];
                data = recv(sock, buffer, sizeof(buffer), 0); // le buffer récupère les données reçues.
                string sbuffer = buffer;
                source += sbuffer.substr(0, data);
            } while (data != 0);
            debug("[OK]\tReception de la source");
            cout << source;
        }
    Donc au premier passage dans la boucle for, aucun souci, il me télécharge la page web. Mais lors du 2ème passage, data reste à 0 (donc il n'a rien reçu), buffer reste "vide". Pourtant j'envoie la requete GET au serveur pour chaque itération de la boucle for.

    Ce qui me pose souci c'est que le premier passage fonctionne bien :S

    Est-ce que quelqu'un peut m'aider ???

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je crois me souvenir qu'il faut fermer la connection après reception d'une page, et donc il faut reconnecter avant chaque requête.

  3. #3
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    justement j'ai voulu essayer de garder ouvert pour eviter de perdre du temps dans le programme pour chaque page, vu qu'elles sont sur le meme site.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 28
    Points
    28
    Par défaut
    Je confirme, il faut bien se déconnecter avant chaque nouvelle requête.

  5. #5
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Bon tampis, effectivement ça marche quand je fais toute la procedure pour chaque requete, c'est simplement que ça me semblait pas optimal de devoir me reconnecter au meme serveur à chaque fois.

    Merci quand meme !!!

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Utilises HTTP/1.1, et la connection restera ouverte (header connection: keep-alive, ou un truc du genre)
    En HTTP/1.0 un requete = une connection.

    Dans tous les cas, il faut 'lire' le header Connection: xxxxx de la réponse. Si 'close' est dedans, la connection sera fermée, et doit donc être réouverte...

    Pseudocode:
    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
    boolean opened = false;
    while (things to do) {
       open-socket-connection
       opened = true;
       while (opened && things to do) {
           send-request
           read-response
           if (response.getHeader("connection") == 'close' || null) {
               opened = false;
               close-socket-connection;
           }
        }
    }
    if (opened)
       close-socket-connection;
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Ok merci je vais essayer tout ça dans la journée.

    Merci beaucoup

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

Discussions similaires

  1. Winsock fonction recv pas fiable?
    Par ssmint dans le forum Développement
    Réponses: 4
    Dernier message: 26/11/2007, 20h41
  2. [Socket] - Problème recv avec UTF8
    Par JuS80 dans le forum Réseau
    Réponses: 4
    Dernier message: 17/04/2007, 09h46
  3. [Winsock] Problème avec les espaces
    Par Fiquet dans le forum Développement
    Réponses: 3
    Dernier message: 12/01/2006, 18h06
  4. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  5. [Virtual Pascal] [WinSock] Problème d'affichage structure SERVENT
    Par Alcatîz dans le forum Autres IDE
    Réponses: 2
    Dernier message: 12/07/2005, 22h53

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