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

Qt Discussion :

[Qt][network] est il possible d'envoyer des paquets autre que du texte


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut [Qt][network] est il possible d'envoyer des paquets autre que du texte
    Bonjour voila j'aimerai faire un semblant de voip.
    Alors j'utilise Qt+OpenAL+sndfile

    Mais voila pour ce qui est du reseau avec qt j'ai toujours géré des paquet qui contenaient du texte ou des quint16.
    Mais maintenant j'ai besoin de paquet contenant de vector<ALshort> et je ne sais pas comment proceder. Car bien sur il n'y a pas de surcharge QDataStream &operator>>(vector <ALshort>)

    Voila je vous remercie d'avance pour votre aide.

    Edit : je pensai recupérer chaque ALshort du tableau le convertir en short puis en quint16 et les transferer un a un dans des sous paquets.
    Alors à la reception du paquet je regarde tous les sous paquets et je les reconverti en ALshort puis jen refait un tableau mais ca m'a l'air un peu compliqué et même peut être que ce n'est pas la bonne solution.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par poulecaca Voir le message
    je pensai recupérer chaque ALshort du tableau le convertir en short puis en quint16
    ben AlSHort,short et quint16 son généralement la même chose. Au pire AlSHort est la même chose que quint16.
    Donc pas besoin de conversion. Le plus simple est d'utiliser les QByteArray pour envoyer sur le réseaux.Le top serait que tu compress l'audio avant de l'envoyer.
    Regard peut être un phonon, y as peut être des chose pour faire ce que tu veut.

    Qu'as tu commencé à faire? qu'es ce qui marche? qu'es ce qui ne marche pas?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Oui je me suis rendu compte que la "conversion" quint16 en ALshort allez être ridicule.

    En fait j'en suis qu'en phase de début.
    -----
    Je sais réaliser un client/serveur Qt pour du texte sans utiliser QTextStream.
    Je sais lire un .wav et un ogg (au pire mp3 il suffit d'avoir le codec)
    Je sais enregistrer au micro.
    -----
    Maintenant je sais pas si il est utile de compresser l'audio n'envoyant que petit paquets par petit paquet d'une seconde d'enregistrement si j'utilise des tampons d'une seconde pour décompresser l'audio j'ai l'impression que je vais perdre mon temps. Mais pourquoi pas à la limite ca peut venir après.
    -----
    Pour ce qui est du QBytesArray je comprend pas trop je vais en fait envoyer par le reseau un tableau de bytes ? Si c'est le cas comment stocker un ALshort dans le QBytesArray et refaire l'inverse.

    EDIT : ok j'ai regardé du coté de QBytesArray on peut facilement lui attribuer des short mais un tableau je sais pas peut être vais je devoir envoyer plein de QByteArray autant que de case dans le vector<ALshirt>.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    EN gros, a temps régulier, tu envoie une frame audio (un vecteur de AlShort) au travers de QByteArray.
    Un QByteArray est simplement un vector<uint8>. Il faut juste que tu copie ton tableau dedans.
    Je ne voie pas trop ou est ton problème...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Donc en fait j'envoie mon paquet brut sans faire un sous paquet pour stocker la taille du paquet.
    Et j'attend pas d'avoir recu tout le paquet pour le reespédier ?

    J'essaie de me réexprimer mieux lorsque j'ai réalisé un chat ecrit les paquet que jenvoyai étaient en fait divisés en deux grace a QDataStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    out<< (quint16) 0; //on écrit O pour réserver la place pour la taille
    out<< message; //On ajoute le message à la suite
    out.device()->seek(0); // On se replace au début du paquet
    out << (quint16) (paquet.size() - sizeof(quint16)); //on enleve le zéro
    Alors que maintenant je vais expédier mon QByteArray sans faire un sous paquet taille recu par mon serveur en sous paquet sans savoir si on a tous le tableau et reevoyé au client.

    Ca risque pas d'être un peu anarchique ?

    sauf si on stoque dans QByteArray buffer; buffer[0] = 'taille du paquet';
    et on attend de récupérer au moins la taille d'un quint8 et on recupère sur le serveur buffer[0] pour avoir la taille du paquet.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Bon toujours avec ce problème voila comment je crée un paquet :

    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
     
    if(!initOpenAl())
    	{
    		cerr<<"impossible d'envoyer le message"<<endl;
    		return;
    	}
     
    	vector<ALshort> sound;
    	sound=loadSound("ocean.wav");
    	cout<<sound.size()<<endl;
    	QByteArray paquet;
    	paquet.append(sound.size()+1);
     
    	for(int i =0;i<(int) sound.size();i++)
    	{
    		paquet.push_back((sound[i]));
    	}
    	cout<<paquet.size()<<endl;
    	cout<<paquet.at(0)<<endl;
    	cout<<"envoie"<<endl;
    	socket->write(paquet);
    	shutdownAL();
    le problème c'est que le paquet n'affiche rien à la position 0 ou aux autres d'ailleur.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par poulecaca Voir le message
    le problème c'est que le paquet n'affiche rien à la position 0 ou aux autres d'ailleur.

    comment cela?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<paquet.at(0)<<endl;
    renvoie un espece de losange avec à l'intérieur un point d'intérogation.
    Si je fait paquet.at(3) par exemple la ca n'affiche rien du tout.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<paquet.at(0)<<endl;
    affiche un caractère
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<(int) paquet.at(0)<<endl;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<(int) paquet[0]<<endl;

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Ca m'affiche n'importe quoi : -2.
    Une taille négative :S.

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par poulecaca Voir le message
    Ca m'affiche n'importe quoi : -2.
    Une taille négative :S.
    A oui paquet doit surement contenir des unsigned char. Si tu as -2 cela doit correspondre à 0xFD et donc 253 éléments.
    Et avec cela?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<(unsigned int) paquet[0]<<endl;

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    cette fois ci en effet ca pourrait etre correct j'ai : 4294967294 mais c'est juste 4294967296 - 2 (la valeur max d'un int sur 32 bit -2 la valeur que j'ai en signed).
    le problème est que je devrait avoir : 85246

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par poulecaca Voir le message
    cette fois ci en effet ca pourrait etre correct j'ai : 4294967294 mais c'est juste 4294967296 - 2 (la valeur max d'un int sur 32 bit -2 la valeur que j'ai en signed).
    le problème est que je devrait avoir : 85246
    Pour l'affichage, c'est assez proche de
    http://www.developpez.net/forums/d59...t-chaine-hexa/

    pour ton 85246, y as un problème d'utilisation. Un char va de -127 à128 ou de 0 à 255 si il est signé.
    Donc

    paquet.append(sound.size()+1);
    et
    paquet.push_back((sound[i]));

    vont convertire te valeur sur 256... Donc tu as n'importe quoi....

    J'ai regardé un peu. Il faudrait plutôt que tu utilise un QDataStream pour remplire ton QByteArray :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        vector<ALshort> sound;
    	sound=loadSound("ocean.wav");
    	cout<<sound.size()<<endl;
    	QByteArray paquet;
            QDataSTream stream(&paquet,QIODevice::WriteOnly);
    	stream<<sound.size()+1;
     
    	for(int i =0;i<(int) sound.size();i++)
    	{
    		stream<<sound[i];
    	}

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Ok merci en combinant à peu près tout dans ce sujet j'ai finalement réussi.
    Alors merci Mongaulois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/03/2014, 15h52
  2. Est-il possible d'envoyer des message JMS non textuel ?
    Par ctardella dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 12/08/2009, 20h33
  3. Est-ce possible d'envoyer des emails ?
    Par Raiden1234 dans le forum Struts 2
    Réponses: 2
    Dernier message: 30/04/2008, 11h36
  4. Réponses: 2
    Dernier message: 19/09/2007, 10h21
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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