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 :

[Réseau] read socket dans while qui foire


Sujet :

C++

  1. #1
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut [Réseau] read socket dans while qui foire
    salut tout le monde voici le programme (il veut me rendre fou) :

    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
     
            char * chaine,* buff;
    	int socketDescriptor, length, len=0;
    	ofstream f;
    ...
            strcpy(chaine,"GET http://sourceforge.net/index.php HTTP/1.1\r\n"
    		      "Host: sourceforge.net\r\n"
    		      "User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20061023 SUSE/2.0-30 Firefox/2.0 MEGAUPLOAD 1.0\r\n"
    		      "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"
    		      "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
    		      "Accept-Encoding: gzip,deflate\r\n"
    		      "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
    		      "Keep-Alive: 300\r\n"
    		      "Proxy-Connection: close\r\n\r\n");
    ...
            len=strlen(chaine);
            write(socketDescriptor,
    		     chaine,
    		     len);
     
    	for (;length=recv(socketDescriptor,buff,50000, 0)!=0;) {
    	    cout<<"writing"<<endl;
     
    	    f<<buff;
     
    	    sleep(1);
     
    	    *buff=0;
     
    	}
    ...
    si c'est comme ça j'obtient bien la page demandée, mais si j'enleve le sleep(1) j'obtient une page qui n'a aucun sens, des ligne qui se repetent a des endroit different ..

    quelqu'un voit ou est le probleme ?

    merci d'avance.

    PS: je suis sous linux avec gcc et j'envoi cette requete a SQUID.

  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 : 40
    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
    Déjà là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * chaine;
    strcpy(chaine, ...);
    Ton pointeur est initialisé n'importe comment et tu n'alloues aucun espace mémoire pour y copier ta chaîne.
    Si c'est une chaîne constante fais simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* chaine = ...;
    Sinon, utilise std::string (voir FAQ).

  3. #3
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    merci pour la reponse, mais j'ai alloué toutes les chaines correctement (les ... dans le code), je ne voulais pas encombrer le code, mais comme je l'ai dis en laissant le sleep(1) ça marche a merveille (j'espere que ça ne va pas faire un tour dans le betisier).

    autres indication, en laissant le sleep(1) dans la boucle, ça m'affiche deux "wrinting" et il termine, mais en l'enlevant il m'affiche une disaine avec l'erreur citées plus haut.

    une autre idée ?

    merci encore

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 136
    Points
    136
    Par défaut
    comment se décompose la lecture de la socket?

  5. #5
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    bon au cas ou le probleme viendrai du reste je poste tout 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
    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
     
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    	char * chaine,* buff;
    	int socketDescriptor, length, len=0;
    	struct sockaddr_in sockaddrStruct;
    	ofstream f;
     
    	sockaddrStruct.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sockaddrStruct.sin_family = AF_INET;
            sockaddrStruct.sin_port = htons(3128);//port);
    	sockaddrStruct.sin_zero[8]=0;
     
    	chaine = (char * )malloc(600);
     
    	if (!chaine){
    		cout<<"erreur d'allocation de \'chaine\'"<<endl;
    		return -1;
    	}
     
    	buff=(char *)malloc(50000);
     
    	if (!buff){
    		cout<<"erreur d'allocation de \'buff\'"<<endl;
    		return -1;
    	}
    	*buff=0;
     
    	strcpy(chaine,"GET http://sourceforge.net/index.php HTTP/1.1\r\n"
    		      "Host: sourceforge.net\r\n"
    		      "User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20061023 SUSE/2.0-30 Firefox/2.0 MEGAUPLOAD 1.0\r\n"
    		      "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"
    		      "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
    		      "Accept-Encoding: gzip,deflate\r\n"
    		      "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
    		      "Keep-Alive: 300\r\n"
    		      "Proxy-Connection: close\r\n\r\n");
     
    	f.open("f.txt");
     
    	if(!f){
    		cout<<"erreur d'ouverture du fichier"<<endl;
    		return -1;
    	}
     
     
    	if ((socketDescriptor = socket(AF_INET, SOCK_STREAM, 0))<0){
     
    		cout<<"erreur de creation de socket"<<endl;
    		return -1;
    	}
     
    	if (connect(socketDescriptor,
    		     (struct sockaddr *)&sockaddrStruct,
    		     sizeof(sockaddrStruct)
    		     )<0){
    		cout<<"erreur de connexion de la socket"<<endl;
    		return -1;
     
     
    	}
    	len=strlen(chaine);
    	length=write(socketDescriptor,
    		     chaine,
    		     len);
     
    	for (;length=recv(socketDescriptor,buff,50000, 0)!=0;) {
    	    cout<<"writing"<<endl;
     
    	    f<<buff;
     
    	    sleep(1);
     
    	    *buff=0;
     
    	}
     
    	return EXIT_SUCCESS;
    }

  6. #6
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    Citation Envoyé par craryb Voir le message
    comment se décompose la lecture de la socket?
    desolé j'ai pas compris la question .

    PS : c'est mon premier projet en C++.

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	for (;length=recv(socketDescriptor,buff,50000, 0)!=0;) {
    	    cout<<"writing"<<endl;
     
    	    f<<buff;
     
    	    sleep(1);
     
    	    *buff=0;
     
    	}
    D'une part... je me demande toujours quelle est la précédence des opérateurs (d'autant qu'elle peut changer d'un langage à un autre) ... donc les trucs a=b!=0 .... a va contenir "true"/"false" ?
    Si c'est pour faire !=0, autant ne rien mettre du tout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (lenth=recv(...)) {
    }
    Pour le probleme lui même, apres chaque receive, il n 'y a que 'length' caractères valides dans le buffer.
    Et celui ci peut très bien contenir des 0 (receptions d'image par exemple).
    Donc le f<<buff (qui se traduit en écriture d'une chaine de caractères) ne marchera pas correctement (a priori il s'arrete au premier 0 rencontré, donc parfois aucun avec lecture non autorisée à la clé).
    Et le sleep(1); est complétement inutile.

    Si tu ne t'attends qu'à du texte en réponse, tu peux rajouter un:
    avant l'écriture, mais c'est un quick-fix pour mieux planter dans d'autres cas.

  8. #8
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    merci beaucoup pour le tuyeau, ça marche a present, et j'ai remplacé le f<< par un write, merci beaucoup.

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

Discussions similaires

  1. Sortir d'un while qui n'est pas dans la fonction
    Par NoIdea dans le forum Débuter
    Réponses: 23
    Dernier message: 15/07/2010, 18h38
  2. [VBA-E] Aide pour un bouton dans excel qui exécuterai mon code.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2006, 17h23
  3. [MySQL] Insertion dans bdd qui plante
    Par pssinjaune dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/04/2006, 17h21
  4. IOException sur socket dans un package
    Par gint dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/03/2006, 20h45
  5. requête dans acces qui ne marche pas...
    Par sam01 dans le forum Access
    Réponses: 3
    Dernier message: 14/12/2005, 17h48

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