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

Réseau Discussion :

Problème de communication QLocalSocket/QLocalServer


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut Problème de communication QLocalSocket/QLocalServer
    Bonjour,

    J'ai un petit souci lors de l'écriture de données dans ma socket connecté au serveur.

    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
    void RecuperationMessageThread::SendDataToClient()
    {
    		QByteArray block = QByteArray("hello");
    		QString message = block;
    
    		/* Si le message est vide */
    		if(message == "")
    			qDebug() << " Il n'y a pas de données ";
    		else
    		{
    			qDebug() << " Il y a des données à transmettre ";
    			mMutex.lock();
    			QDataStream out(&block, QIODevice::WriteOnly);
    
    			out.setVersion(QDataStream::Qt_4_6);
    			out << (quint16)0;
    			out.device()->seek(0);
    			out << (quint16)(block.size() - sizeof(quint16));
    
    			client = this->m_server.nextPendingConnection();
    			qDebug() << "Nouvelle connexion sur le serveur ";
    			connect(client, SIGNAL(disconnected()),client, SLOT(deleteLater()));
    
    			if(client->write(block) == -1) // erreur se produit lorsque j'arrive sur cette ligne
    				qDebug() << " L'écriture des données à échouée  ";
    			else
    				qDebug() << " Ecriture des données ";
    
    			client->flush();
    			client->disconnectFromServer();
    			mMutex.unlock();
    		}
    }
    Voici l'erreur en question:

    Unhandled exception at 0x00024c60 in BoxConnector.exe: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000004.

    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    Re bonjour,

    J'ai résolu une partie du problème visiblement lorsque on fait un socket->write() dans un QThread le compil n'aime pas trop !

    J'ai donc mit ce code dans une méthode que je vais appeler avec un connect()

    Donc le signal sera la méthode qui permet de capter la présence d'un message et le slot sera cette méthode d'envoi de données!

    Or le problème que j'ai maintenant, c'est lors de l'envoi de données du serveur au client les données ne sont pas conservées !

    Je m'explique : sur le serveur j'envoi un QByteArray block= QByteArray("hello") et du côté client je reçoit un block de taille 0.

    pourquoi les données ne sont pas conservées ?!

    je vous remercie d'avance

  3. #3
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    As tu plutot essayer quelques chose comme ça:

    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
    void RecuperationMessageThread::SendDataToClient()
    {
    		QByteArray block;
    		QString message = "hello";
     
    		/* Si le message est vide */
    		if(message == "")
    			qDebug() << " Il n'y a pas de données ";
    		else
    		{
    			qDebug() << " Il y a des données à transmettre ";
    			mMutex.lock();
    			QDataStream out(&block, QIODevice::WriteOnly);
     
    			out.setVersion(QDataStream::Qt_4_6);
    			out << (quint16)0;
    			out << message;
    			out.device()->seek(0);
    			out << (quint16)(block.size() - sizeof(quint16));
     
    			client = this->m_server.nextPendingConnection();
    			qDebug() << "Nouvelle connexion sur le serveur ";
    			connect(client, SIGNAL(disconnected()),client, SLOT(deleteLater()));
     
    			client->write(block);
     
    			client->flush();
    			client->disconnectFromServer();
    			mMutex.unlock();
    		}
    }
    J'ai modifier légerement ton code regarde si cela fonctionne meiux ou alors explique mieux ou se trouve ton problème.

    De meme montre plus de code car il y a peut etre des erreurs ailleurs...

    PS: Juste pour info ton mutex il sert a quoi ?? tu veux proteger quoi comme ressources ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    Bonjour superjaja,

    En fait j'ai réussi à faire l'envoi, j'ai enlevé la méthode qui était dans un thread et je l'aie mise dans ma classe Localserver, et maintenant je déclenche la méthode grâce au système signal/slot qui se déclenche lorsque je reçoit un message à envoyer au client! Ce qui nous donne ceci :

    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
     
    void LocalServer::SendDataToClient()
    {
    			QByteArray block = MessagingSystemSerial::getInstance()->GetDataByteArray();
     
    			QDataStream out(&block, QIODevice::WriteOnly);
     
    			out.setVersion(QDataStream::Qt_4_6);
    			out << (quint16)0;
    			out.device()->seek(0);
    			out << (quint16)(block.size() - sizeof(quint16));
     
    			if(client->write(block) == -1)
    				qDebug() << " L'écriture des données à échouée  ";
    			else
    				qDebug() << " Ecriture des données ";
     
    			client->flush();
    			client->disconnectFromServer();
    }
    Donc je reçoit un message, je le transfère et je l'écrit dans ma socket pour l'envoyer au client.

    Or lorsque que j'envoi mon message du côté serveur, de taille 'X'. Du côté du client je reçoit une trame de taille 'X-2'.

    Donc par exemple: Côté serveur: "hello" (size = 5) --> Côté client: size = 3

    je te donne mon code de récupération de données :

    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
    void Socket::readData()
     {
         QDataStream in(socket);
         in.setVersion(QDataStream::Qt_4_6);
    
         if (blockSize == 0) 
    	 {
             // si le nombre d'octet disponible pour la lecture est inférieur à la taille du message entier, on arrête la méthode.
    		 if (socket->bytesAvailable() < (int)sizeof(quint16))
                 return;
    
             in >> blockSize;
         }
    
    	if (socket->bytesAvailable() < blockSize) // Si on n'a pas encore tout reçu, on arrête la methode.
            return;
    	else
    	{
    		qDebug() << "Tout le message a été reçu";
    		//Ici je veux afficher le message dans Qdebug mais je ne sais pas comment récupérer les infos (c'est juste pour voir que les données sont intactes, plus tard je ferai un checksum)
    	}
    
        if (in.atEnd())
             return;
    
    	// Partie de code un peu flou ??! Si au passage tu peux m'expliquer cette partie de code ??
        QString nextData;
        in >> nextData;
    
        if (nextData == currentData) 
    	{
            QTimer::singleShot(0, this, SLOT(requestNewConnexion()));
            return;
        }
    	
    	currentData = nextData;
     }
    Donc voila si je suis pas assez clair dites le moi !

    Merci de votre aide !

  5. #5
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Je ne suis pas sur que tu es bien compris déjà comment fonction QDataStream.
    Le but de cette classe est de sérialiser des données donc utilise là déjà comme je t'ai montrer dans mon post précédent ou alors comme utiliser dans l'exemple Qt (c'est la même chose).

    De plus si tu ne suis pas à la lettre l'exemple Qt tu ne pourras pas réussir a relire les infos du cote de ton client car tu fausse le protocole mis en place.

    En gros le protocole de communication est le suivant:
    Dans chaque trame tu as tout d'abord la taille de la trame (mis dans les deux premier octect) puis le message qui est de longeur taille de la trame.

    En gros avec ce que tu écris tu dis que ta trame fait toujours 0 de longueur...

    De plus il faut que tu écrives dans ton QByteArray au travers de ton QDataStream sinon cela ne peut pas marcher...
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    J'ai utilisé le code que tu m'as donné précédemment, or souci le blocksize reste à 0 contrairement a mes derniers essai avec les derniers extraits de code que j'ai donné !

    Donc d'après ce que tu me dis le fait que je récupère X-2 octets du côté client serai normal vu qu'il y a la taille de la trame sur les deux premiers octets ?

    Par contre, je n'ai pas bien compris la fin de ton message :
    De plus il faut que tu écrives dans ton QByteArray au travers de ton QDataStream sinon cela ne peut pas marcher...
    Comment veux-tu faire pour écrire dans mon QByteArray au travers du QDatastream ?


    Mais tu as raison sur un point c'est que je ne suis pas trop à l'aise avec la fonction QDatastream !

    Mon But final, est juste de vérifier que la trame que j'ai du côté serveur est égale à celle reçue côté client.

    Merci de ton aide !

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

Discussions similaires

  1. Problème de communication par sockets
    Par Linio dans le forum Entrée/Sortie
    Réponses: 33
    Dernier message: 06/05/2006, 18h50
  2. problème de communication
    Par yassinchaouki dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 20/04/2006, 10h46
  3. Problème de communication client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 10
    Dernier message: 09/03/2006, 13h12
  4. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 22h18
  5. [WinService][C#] Problème de communication
    Par Pfeffer dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/07/2005, 15h54

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