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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre chevronn� Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 chevronn� Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

  5. #5
    Membre chevronn� Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    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++.

  6. #6
    Expert confirm�

    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
    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.

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

  8. #8
    Membre chevronn� Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    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;
    }

+ 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, 17h38
  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, 16h23
  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, 16h21
  4. IOException sur socket dans un package
    Par gint dans le forum Entr�e/Sortie
    R�ponses: 4
    Dernier message: 29/03/2006, 19h45
  5. requ�te dans acces qui ne marche pas...
    Par sam01 dans le forum Access
    R�ponses: 3
    Dernier message: 14/12/2005, 16h48

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