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 :

Methode write des sockets n'envoie rien


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut Methode write des sockets n'envoie rien
    Bonjour,

    Je suis entrain de développer un petit client réseau.

    Dans ce client j'ai un slot qui est appelé à chaque pression sur un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    QString messageAEnvoyer = (m_lineedit2->text());
        out << (quint16) 0;
        out << messageAEnvoyer;
        out.device()->seek(0);
        out << (quint16) (paquet.size() - sizeof(quint16));
        m_socket->write(paquet); // On envoie le paquet
        m_lineedit2->clear();
    J'ai presque recopier mot pour mot l'exemple du sdz j'ai juste changer le nom de mon socket et la provenance du message à envoyer

    J'ai également connecter le slot readyRead de mon socket a une méthode qui m'affiche "data" dans un QtextEdit, pour le moment, je ne veux pas interpréter ce que le serveur m'envoie je m'en sers pour voir si le serveur me répond.

    Quand je me connecte a un serveur ftp en local, le serveur m'envoie le message de bienvenue, mais a chaque fois que je lui envoie une trame rien ne me revient, bien sur en temps normal le ftp me renvoie une trame meme si il n'a pas compris la mienne (testé avec telnet).

    Edit : Solution trouvé, la trame envoyé était sérialisé donc le serveur ne comprenait pas je pense j'ai résolu mon souci en procédent comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QByteArray paquet = (m_lineedit2->text().toAscii()+"\n");
    char* message = paquet.data();
    m_socket->write(message,(quint64) (strlen(message)));
    Désolé de vous avoir dérangé pour si peu.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out << messageAEnvoyer;
    sérialise bien une QString et non le directement le texte contenue.

    Le plus propre est bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out << messageAEnvoyer.toLatin1();
    ou une autre fonction de conversion. Tout dépend de l'encodage utilisé.


    Par contre, comme on peut déjà utiliser QByteArray, évite de passer par char*

    Tu n'est pas et ne sera pas le seul à avoir eu ce problème
    Merci d'avoir donné la solution
    Pense au bouton

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut
    Si j'applique .toLatin1(). ma trame n'est pas bonne :/ même avec .toAscii()

    Exemple avec l'user "monnom.monprenom"

    \000\032\000\000\000\026user monnom.monprenom

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    QString messageAEnvoyer = (m_lineedit2->text()+"\n");
    out << (quint16) 0;
    out << messageAEnvoyer.toAscii();
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));
    m_socket->write(paquet); // On envoie le paquet
    m_lineedit2->clear();
    J'ai essayé avec le "\n" et sans -> même résultat.

  4. #4
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    salut,

    le souci vient à mon avis de l'emploi de la fonction 'seek' qui n'est valable que pour le QIODevice permettant l'accès aléatoire:
    Citation Envoyé par QtDoc
    For random-access devices, this function sets the current position to pos, returning true on success, or false if an error occurred. For sequential devices, the default behavior is to do nothing and return false.
    Or le QIODevice représenté par une socket est un device de type séquentiel. La fonction seek() ne peut donc pas être utilisée. Pour s'en persuader:

    1/ Teste la valeur de retour de seek ; à tous les coups elle doit retourner 'false'

    2/ Même principe en testant la valeur de retour de 'isSequential()' qui si elle retourne 'true' implique que la fonction 'seek' ne peut pas être utilisée.

    L'idée serait donc de générer un QByteArray intermédiaire (ou un buffer dans ce style) pour préparer les données à envoyer. Une fois celles-ci construites, tu envoies en une seule fois l'ensemble de ton bloc de données.

    EDIT: un petit tour dans le code source de QAbstractSocket.cpp finit de nous convaincre qu'une socket est bien un device de type séquentiel.

    EDIT: non, j'avais mal lu, tu fais un seek sur un QDataStream basé sur un QByteArray, et pas sur la socket. Oublie mon post

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    à oui tien
    out << messageAEnvoyer.toAscii();
    serialise le QByteArray et non le contenue.
    Tu peut faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        QByteArray paquet;
        QDataStream out(&paquet, QIODevice::WriteOnly);
        QString messageAEnvoyer = "monnom.monprenom";
        out << (quint16) 0;
        paquet += messageAEnvoyer.toAscii();
        out.device()->seek(0);
        out << (quint16) (paquet.size() - sizeof(quint16));

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut
    En faisaint comme expliqué j'obtient une tramme presque bonne ^^ : \000\025USER monnom.monprenom.

    J'y suis presque

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par geek-59600 Voir le message
    En faisaint comme expliqué j'obtient une tramme presque bonne ^^ : \000\025USER monnom.monprenom.

    J'y suis presque
    pourquoi ce n'est pas bon?
    tu as bien la taille sur 16bit + ton text.

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

Discussions similaires

  1. envoi de fichier par des Sockets java
    Par Maha Ing dans le forum MATLAB
    Réponses: 0
    Dernier message: 10/05/2014, 18h38
  2. Envoi d'une requête SQL SELECT via des socket
    Par akram1985 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 17/09/2011, 11h06
  3. Réponses: 2
    Dernier message: 15/02/2010, 13h08
  4. probleme de gestion de clients avec des sockets....
    Par ludvo dans le forum Réseau
    Réponses: 6
    Dernier message: 25/09/2003, 12h37
  5. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24

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