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 :

Socket, C++ et buffer !


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Consultant informatique
    Inscrit en
    F�vrier 2004
    Messages
    93
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 93
    Par d�faut Socket, C++ et buffer !
    Bonjour � tous !

    J'avoue que je ne comprends plus (pourtant �a fait deux jours que je cherche ).

    J'essaie de faire une appli ftp (client) pour me faire la main avec le C++ sous GNU/Linux (j'ai quelques connaissances en Java).

    Le probl�me se situe exactement ici :

    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
    const int MAX_REPLY_CHARS = 5000;
    char buffer_reply_chr[MAX_REPLY_CHARS];
    void fonction()
    {
    //===d�but
    if(recv(sockfd, &buffer_reply_chr, MAX_REPLY_CHARS, 0) == -1)
    {
        perror("recv");
        exit(1);
    }
    
    traiter_recv(buffer_reply_chr);
    //===fin
    }
    
    void Connect::traiter_recv(char* buffer)
    {
        for(int i = 0; i<=MAX_REPLY_CHARS; i++)
        {
            cout << buffer[i];
        }
    }
    Ce qu'il faut savoir c'est que le socket se cr�e normalement. Mon probl�me se trouve avec la gestion des tableaux et surtout avec la variable buffer_reply_chr ! Si j'ai bien compris (d'apr�s les specifications UNIX), je suis sens� donner un &buffer_reply_char dans la fonction recv(...). Ce que je fais.

    Apr�s, j'ai essay� plusieurs mani�res pour r�cup�rer le message renvoy� par le serveur mais j'ai une sortie sur la console atroce (sauf la premi�re ligne qui est lisible et qui ne contient aucun signes bizarres).

    220 ProFTPD 1.3.0rc1 Server [xxx.xxx.xx.xxx]
    ����C�������(�������������hY���{��|&2�������������t�t����|����� C������� ����������������Y���{����������6��@���������W���������u7������W������0�������8���F~�� ���������������lZ���{��F~�������������8~���Z���{��F~��4Y���g�����8~��PY���g��@W���������
    ����|&�����������C������� ��������������[���{�����������Y���Y���������������������r��C�����^����������p ^�)D^�)D`�)D��^�������������[��5}���Y�����������Y��������_������������]�������Y��������������xZ�������]�������]���]���]����4 ������������xZ���Y������``�����]������Z��������������[�������]�������] ���]���]���V6��������������[��Z�������[��xZ��u7�4����^��*���4�]��F~��| [�����8~�������]���]���]������6��F~��|[���Z��������������[��u7�����^��1��� �]������\�������]��6���]���]���]��������|[��u7�����^��1����]��& ����^��ス����������������C����������������!��$\��1�������6�������]�� �����翃�����������������#������`����\��@�������\���������������� ���\���������]�����#���ユ��������������\��6������#������ �������^��q���`�������'�������.���\����������������x��P����``���������� ���������������x��P����`�`����������������`�ユ��������� ��� g��8g�� g��8g�� ������B���@����Db���2�����`���
    ���x`���@�R������[������ ����YC�������������������
    _��1������`�����������0�����翃�������C�������������������\ _��1���C�������������������|_��1�������V�������1��� �����翃���������������y:<_R����������4`��@��t���_������������� 1������������_��z��� z���y:<``������_R�����������#�����������z���H���������C������������������|`��1���C��������������������`��1�������V������� �����翃����������������<�n�����������Ta��@���8
    ��a��������� ���>� Y�����������a���a��@���Pa������<��a������n��� ����-������Pa��
    ����`a��
    >� �a������Y������a�����������a��B���������������T��⎽ ┼���-շ����淰�Է�▒���ڷ��淜
    ����0��▒�� ����淜
    ���▒��$�U���
    ����0��▒�� %���-���
    ����0��▒���񷸡�
    ��
    C⎺┼┼␊␌├␋⎺┼ ⎽┤␌␌␊⎽⎽�┤┌┌≤ ␊⎽├▒␉┌␋⎽␤␊␍. R␊▒␍≤ �⎺⎼ ␌⎺└└▒┼␍⎽.
    et � la console, je ne peux plus que taper des caract�res tout aussi �tranges !

    Bon, visiblement j'ai manqu� un truc (ou pas compris) ! Si une �me charitable pouvait me sauver, �a serait sympa !

    (ah oui, ce que je veux faire c'est afficher le message re�u proprement... visiblement il n'y a qu'une ligne de message ? est-ce possible ? comment le savoir ?)

    Merci de m'avoir lu en tous cas .

  2. #2
    Membre �m�rite Avatar de MatRem
    Profil pro
    Inscrit en
    D�cembre 2002
    Messages
    750
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2002
    Messages : 750
    Par d�faut
    Je pense que tu devrais allouer la m�moire n�cessaire � ton buffer:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     const unsigned short BUFFER_SIZE = 100;
    char buffer_reply_chr[BUFFER_SIZE];
    apr�s pour ton appel recv:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    recv(sockfd, buffer_reply_chr, BUFFER_SIZE, 0)

  3. #3
    Membre confirm�
    Profil pro
    Consultant informatique
    Inscrit en
    F�vrier 2004
    Messages
    93
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 93
    Par d�faut
    Citation Envoy� par MatRem
    Je pense que tu devrais allouer la m�moire n�cessaire � ton buffer:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     const unsigned short BUFFER_SIZE = 100;
    char buffer_reply_chr[BUFFER_SIZE];
    apr�s pour ton appel recv:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    recv(sockfd, buffer_reply_chr, BUFFER_SIZE, 0)
    Merci beaucoup pour cette r�ponse . J'avais malheureusement oubli� deux lignes dans le bout de code que j'ai fourni dans le premier post, celles-ci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    const int MAX_REPLY_CHARS = 5000;
    char buffer_reply_chr[MAX_REPLY_CHARS];
    D�sol�.

    Par contre comme tu le sugg�res, je ferais mieux de supprimer le sizeof(buffer_reply_chr) pour le remplacer par la constante MAX_REPLY_CHARS... c'est plus rapide/propre et peut-�tre aussi plus correct (je teste �a).

    Marche pas. J'obtiens toujours une sortie console dans le m�me style qu'au dessus ! Mis � part l'esth�tique relative, on ne peut rien en tirer...

    Dans la fonction recv(...), ne vaut-il mieux pas passer par r�f�rence le tableau buffer_reply_chr ?? Parce que s'il devient trop gros, �a risque de poser probl�me non ? (J'ai test� les deux et visiblement �a fonctionne identiquement donc je laisse mon petit &).

  4. #4
    R�dacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de syst�me d�information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Architecte de syst�me d�information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par d�faut
    bien le bonsoir,

    Citation Envoy� par agent007se
    Marche pas. J'obtiens toujours une sortie console dans le m�me style qu'au dessus ! Mis � part l'esth�tique relative, on ne peut rien en tirer...
    es-tu s�r que ton envoi de donn�es est fait correctement ?

    Dans la fonction recv(...), ne vaut-il mieux pas passer par r�f�rence le tableau buffer_reply_chr ?? Parce que s'il devient trop gros, �a risque de poser probl�me non ?
    non, ne pas passer de r�f�rence � un tableau. La fonction recv est faite pour prendre un pointeur sur une zone m�moire (un void*)

  5. #5
    Membre confirm�
    Profil pro
    Consultant informatique
    Inscrit en
    F�vrier 2004
    Messages
    93
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 93
    Par d�faut
    Citation Envoy� par khayyam90
    bien le bonsoir,


    es-tu s�r que ton envoi de donn�es est fait correctement ?

    non, ne pas passer de r�f�rence � un tableau. La fonction recv est faite pour prendre un pointeur sur une zone m�moire (un void*)
    1) hmmm, je n'envoie strictement aucune donn�e au d�but. Lorsque j'initie la connection via :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    if(connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == -1)
        {
            perror("connect");
            exit(1);
        }
    le serveur FTP renvoie un message (220 (=Service ready for new user) dans ce cas-ci...). Ce que j'aimerais faire c'est recevoir tout le message quelqu'il soit et l'afficher correcter pour tout serveur ftp... (eh oui, je n'en suis qu'au d�but ).

    2) d'accord pour le pointeur mais en C++ j'ai lu qu'un tableau �tait justement un pointeur vers le premier �l�ment du tableau ! donc si je passe en r�f�rence mon tableau (&tableau), c'est un pointeur finalement non ? (r�f�rence vers un pointeur)

    => je dis ceci mais ce n'est qu'une hypoth�se newbiste s�rement fausse mais je tente simplement de poser les questions telles qu'elles me viennent pour bien comprendre la notion de pointeur/r�f�rence (qui est la grosse, grosse diff�rence avec Java...) (ps: j'ai lu pas mal de tutos mais �a ne veut toujours pas entrer en pratique, j'aimerais aussi une confirmation ou infirmation de mon "hypoth�se")

    Sinon j'ai compris, un pointeur (!) pour la fonction recv comme indiqu� dans la d�finition de la fonction. Donc je retire mon &. Merci pour cette pr�cision .

  6. #6
    Membre confirm�
    Profil pro
    Consultant informatique
    Inscrit en
    F�vrier 2004
    Messages
    93
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 93
    Par d�faut
    Ok, je me r�pond � moi-m�me avant d'aller dormir .

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    octets = read(sockfd, buffer_reply_chr, MAX_REPLY_CHARS);
    write(STDOUT_FILENO, buffer_reply_chr, octets);
    voil�, deux malheureuses lignes � ajouter (write �crit parfaitement, ce n'est pas la peine de r�impl�menter la roue mais j'irai quand m�me fouiller dans les sources pour voir comment elle a �t� impl�ment�e !).

    Merci � tous (je mettrai en r�solu d�s qu'on me pr�cise pour ce qui concerne les pointeur ci-dessus !).

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Socket effacer le Buffer
    Par ralf91 dans le forum C
    R�ponses: 4
    Dernier message: 21/01/2012, 12h32
  2. R�ponses: 0
    Dernier message: 17/02/2010, 16h01
  3. Socket : augmenter le buffer de sortie
    Par Gomoz dans le forum C#
    R�ponses: 0
    Dernier message: 26/01/2010, 19h12
  4. [wxwidgets][sockets]envoie d'un buffer
    Par hansaplast dans le forum wxWidgets
    R�ponses: 12
    Dernier message: 20/01/2006, 10h34
  5. [Socket] Buffer et TCP
    Par rgz dans le forum Web & r�seau
    R�ponses: 7
    Dernier message: 14/10/2003, 13h59

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