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 :

Lire un header en C++


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2009
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par d�faut Lire un header en C++
    Bonjour,
    Alors, je dois d�velopper un serveur TFTP en C++. Mon �quipe bosse constamment avec boost, j'ai donc choisi asio pour la partie r�seau.
    Je suis plut�t novice en ce qui concerne la programmation r�seau, et ce sont mes premiers pas avec le protocole UDP.
    Comme base du serveur, j'utilise l'exemple du serveur �cho async UDP.

    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
    class server
    {
    public:
        server(boost::asio::io_service& io_service, short port)
        : io_service_(io_service),
        socket_(io_service, udp::endpoint(udp::v4(), port))
        {
            ...
        }
     
        void handle_receive_from(const boost::system::error_code& error,
                                 size_t bytes_recvd)
        {
            if (!error && bytes_recvd > 0)
            {
                socket_.async_send_to(
                                      boost::asio::buffer(data_, bytes_recvd), sender_endpoint_,
                                      boost::bind(&server::handle_send_to, this,
                                                  boost::asio::placeholders::error,
                                                  boost::asio::placeholders::bytes_transferred));
            }
            else
            {
                ...
            }
        }
        ...
        }
     
    private:
        boost::asio::io_service& io_service_;
        udp::socket socket_;
        udp::endpoint sender_endpoint_;
        enum { max_length = 1024 };
        char data_[max_length];
    };
    En ouvrant un client TFTP et en faisant une demande simple:
    TFTP> get truc.txt

    je peut lire dans mon server (dans le bout de code plus haut), dans ma chaine data_ :
    \0\x01/truc.txt\0netascii\0

    C'est bien ce qui est attendu, donc jusqu'ici je suis content.

    Maintenant, j'ai une question qui pourrait vous sembler triviale, mais comment je lis �a de la fa�on la plus "�l�gante" ?
    Comment lire les 2 premiers bytes afin d'avoir le code d'op�ration (1 dans cet exemple) ?
    Je n'ai jamais eu � faire ce genre de truc et j'ai du mal � trouver des infos...

    Merci de m'avoir lu !

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    Pour lire les deux premiers bytes c'est simple. Tu as un tableau de char...
    bytes en fran�ais c'est octet.
    char == 1 octet == 8 bits.
    Donc lire les 2 premiers "bytes" c'est lire data_[0] et data_[1].

  3. #3
    Membre averti
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2009
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par d�faut
    Merci Astraya, j'ai donc lu "simplement" ces 2 premiers octets.

    Ensuite, je dois "d�couper" ma chaine, mais pas moyen d'utiliser un tokenizer (enfin... j'ai pas r�ussi...) puisque le s�parateur est '\0', la fin de chaine.
    J'ai simplement parcouru la chaine � la recherche des premi�res occurrence du caract�re, puis j'en ai extrait les chaines :

    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
    bool decode_data()
        {
            bool ok = true;
     
            if (data_[0] != '\0')
            {
                // ERROR - TODO
                ok = false;
     
            }
            if (ok && data_[1] == '\1')
            {
                // put op
                opCode = 1; // RRQ
     
            }
            else if (ok && data_[1] == '\2')
            {
                // put op
                opCode = 2; // WRQ
     
            }
            else
            {
                // ERROR - TODO - UNKNOWN CODE
                ok = false;
            }
            int firstSeparator, endSeparator;
            if (ok)
            {
                bool firstSearch = true;
                bool out = false;
     
                for (int i=2; !out && i < max_length; i++)
                {
                    if (data_[i] == '\0')
                    {
                        if (firstSearch)
                        {
                            firstSeparator = i;
                            firstSearch = false;
                        }
                        else
                        {
                            endSeparator = i;
                            out = true;
                        }
                    }
                }
                if (!out)
                {
                    // ERROR - TODO - SYNTAX ERROR
                    ok = false;
                }
            }
            if (ok)
            {
                fileName = std::string(data_ + 2, data_ + firstSeparator);
                transferMode = std::string(data_ + firstSeparator + 1, data_ + endSeparator);
     
                std::cout <<  (opCode == 1 ? "RRQ" : "WRQ")
                    << " - file:\"" << fileName
                    << "\" - mode:" << transferMode << std::endl;
            }
            return ok;
        }
    Ca a l'air de marcher, mais c'est assez "lourd". Y a-t-il un moyen plus "�l�gant" et s�curis� d'utiliser '\0' comme s�parateur ?

    Merci

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    As tu fais des recherches sur internet? std::string + split? il y a plein d'exemple

  5. #5
    Membre averti
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2009
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par d�faut
    Oui, j'ai d�j� utilis� split, mais j'ai l'impression que ma chaine n'est pas lue en entier, mais seulement jusqu'au premier "\0" puisqu'il �quivaut � la fin de la chaine.

    EDIT:
    Je confirme.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::vector<std::string> strs;
    boost::split(strs, data_, boost::is_any_of("\0"));
    ne parcourt pas toute la chaine, je viens de tester.

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    Je pense que utiliser le caract�re de fin de chaine en tant que s�parateur n'est pas �tranger � ton probl�me. Car je te rassure, boost fonctionne tr�s bien.
    Change ton s�parateur .

  7. #7
    Membre averti
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2009
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par d�faut
    Mais je ne peux pas changer le s�parateur, il fait partie du protocole TFTP, et c'est ce que m'enverra n'importe quel client !

  8. #8
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    Bien sur que si: boost::replace_all

    Sinon tu fait un boucle for toi m�me pour couper ton buffer en plusieurs std::vector<std::string>> si tu connais la taille de ta trame c'est facile.

  9. #9
    Membre averti
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2009
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par d�faut
    Merci encore, j'ai choisi de parcourir le char*, je ne cherche de toute fa�on que 2 chaines.

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

Discussions similaires

  1. lire un fichier de donnees sans le header
    Par follichon dans le forum MATLAB
    R�ponses: 1
    Dernier message: 17/01/2013, 13h10
  2. lire et �crire un header http customis�
    Par mpoys dans le forum ASP.NET
    R�ponses: 1
    Dernier message: 28/10/2010, 10h18
  3. [ELF] Lire un header
    Par robertledoux dans le forum Linux
    R�ponses: 1
    Dernier message: 14/03/2009, 17h39
  4. Lire les ent�tes (headers)
    Par coolcoco dans le forum Langage
    R�ponses: 2
    Dernier message: 24/10/2007, 10h57
  5. lire a partie d'un header
    Par 4daime dans le forum C++
    R�ponses: 8
    Dernier message: 14/08/2007, 22h01

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