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 : 38
    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 : 38
    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 : 38
    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 : 38
    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. Socket: Tailles des buffers en émission et réception
    Par rulianf dans le forum Réseau
    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