1 (edited by lindbergh05 02-03-2011 15:21:14)

Topic: Réception du flux xml sur le socket : Savoir quand tout a été transmis

Bonjour !

Je viens vers vous car je fais face à un problème de programmation socket :

voici une partie de mon code C++ (légèrement simplifié):

                        // accepter le nouveau socket
                        sockaddr_in addr;
                        socklen_t addrlen = sizeof(addr);
                        _x_socket = accept(_serverSocket, reinterpret_cast<sockaddr*>(&addr), &addrlen);
                        if( _x_socket < 0 )
                              throw  std::runtime_error("erreur");
                        
                        // initialiser la connexion xmpp
                        FD_ZERO(&_x_readfs);
                        FD_SET(_x_socket, &_x_readfs);
                        if( select(_x_socket +1, &_x_readfs, 0, 0, 0) < 0 ){
                              throw  std::runtime_error("erreur");
                        }
                        if( FD_ISSET(_x_socket, &_x_readfs) ){
                              while( true ){
                                    static char buffer[1024] = {0};
                                    static int length;
                                    if( (length = recv(_x_socket, &buffer, sizeof(buffer), 0)) == -1 )
                                          throw  std::runtime_error("erreur");
                                    else
                                          for(int i=0; i<length; ++i){
                                                ; // récupérer les informations du buffer
                                          }
                              }
                        }

Dans ce code, la boucle while permet de faire un recv pour extraire les données du socket. La variable length récupère au passage la longueur du message à lire depuis le buffer pour ce tour de la boucle while.
Le problème se corse. D'après mes "expérience" et devant l'infructuosité de mes recherches (que ce soit dans les RFC ou ailleurs) :

1 - Le flux XML transmis n'est pas terminé par le caractère null '\0'. Pas très pratique...
2 - Le flux n'est pas précédé par un nombre indiquant la longueur du flux, ou alors je n'ai pas réussi à le voir.

à partir de là, comment dois-je faire pour savoir quand ne plus boucler et quand recv sera bloquante ?


Je vous remercie beaucoup par avance pour toute aide ! hmm

Re: Réception du flux xml sur le socket : Savoir quand tout a été transmis

je te conseillerais plutot de prendre une lib toute faite ( libxml, au hasard ).

Sinon non, faut parser le flux xml , ou faire un décompte des < et des > pour savoir à quel moment tu es dans le flux. C'est pas pratique, je le concéde.

Re: Réception du flux xml sur le socket : Savoir quand tout a été transmis

D'accord pour le flux... C'était ma question. hmm Tans pis alors, va pour la méthode brico
Merci !