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 :

[Sockets] Problème de reception des données client –> serveur


Sujet :

Qt

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut [Sockets] Problème de reception des données client –> serveur
    Bonsoir,

    Je suis confronté depuis un petit moment à un problème bien ennuyeux. Ça concerne les sockets, grâce à un analyseur de trafic réseau j'ai pu déterminer que les données étaient bien envoyées par le serveur au client. Et de plus que les données sont bien reçues par le client. Mais ! Le signal readyRead() n'est jamais émis !

    Voici le code :

    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
    System::System(QSettings *settings, QSystemTrayIcon *sysTray) : QObject()
    {
    	_server = new QTcpServer;
    	_client = new QTcpSocket;
    	_sysTray = sysTray;
    	_settings = settings;
     
    	if(!_server->listen(QHostAddress::Any, settings->value("localPort").toInt()))
    		sysTray->showMessage("Erreur de connexion", "La connexion na pas pu être établie sur le port <strong>"+QString::number(settings->value("localPort").toInt())+"</strong>. Vérifiez la configuration de votre pare-feu et de votre router.", QSystemTrayIcon::Critical, 5000);
    	else
    	{
    		_client->connectToHost(settings->value("targetHost").toString(), settings->value("targetPort").toInt());
    		connect(_client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(clientError(QAbstractSocket::SocketError)));
    		connect(_client, SIGNAL(connected()), this, SLOT(connected()));
    		connect(_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
    	}
    }
     
    void System::sendAlert()
    {
    	QByteArray packet;
    	QDataStream out(&packet, QIODevice::WriteOnly);
     
    	out << "K";
     
    	_distantClient->write(packet);
    }
     
    void System::connected()
    {
    	_sysTray->setIcon(QIcon(":/idle.png"));
    	_sysTray->setToolTip("Prêt - Aucune alerte");
    }
     
    void System::newConnection()
    {
    	_distantClient = _server->nextPendingConnection();
    	_sysTray->showMessage("Connecté", "Connecté", QSystemTrayIcon::Information);
    	connect(_distantClient, SIGNAL(readyRead()), this, SLOT(alertReceived()));
    }
     
    void System::alertReceived()
    {
    	std::cout << "Recu" << std::endl;
     
    	QDataStream in(_distantClient);
     
    	QString datas;
    	in >> datas;
     
    	QMessageBox::information(NULL, datas, datas);
    }
    J'ai essayé de désactiver le pare-feu mais sans succès.

    Merci d'avance !

    EDIT : J'ai fait une petite erreur, pour le readyRead() c'est _client qui émet le signal et pas _distantClient. Maintenant le signale est émis au bon moment (quand le serveur envoie les données au client), cependant les données reçues sont vides _client->bytesAvailable() vaut 0.

    EDIT2 : Bon, j'ai envoyé un packet beaucoup plus grand, j'arrive à récupérer la taille du message avec _client->bytesAvailable(), mais quand je tente de récupérer les données dans un QString, ce dernier est vide !

  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
    Salut.
    Si je ne me trompe pas.

    readyRead() est envoyé quand il y as quelque chose à lire. Seulement il ne peut savoir pour toi si tout est arrivé.
    Ce qu'il faut faire c'est de mettre la taille de ce que tu envoie juste devant l'objet.

    Ainsi a la réception, tu lit la taille à récupérer, et tu attend que ta soket est assez d'information pour traiter le bitstream.

  3. #3
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Et si tu connectais le signal readyRead() dasns ton constructeur, ça fiabiliserait peut-être le système ?

    Sinon, essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString datas(_distantClient->readAll());
    Vu que _distantClient->readAll() renvoie un QByteArray qui peut être utilisé pour construire un QString.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Salut.
    Si je ne me trompe pas.

    readyRead() est envoyé quand il y as quelque chose à lire. Seulement il ne peut savoir pour toi si tout est arrivé.
    Ce qu'il faut faire c'est de mettre la taille de ce que tu envoie juste devant l'objet.

    Ainsi a la réception, tu lit la taille à récupérer, et tu attend que ta soket est assez d'information pour traiter le bitstream.
    Oui je sais, sauf que readReady() est appelé un seul fois et que bytesAvailable() montre que tout est disponible en un seul coup.

    FloMo › J'ai déjà essayé ça, mais sans succès

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2015, 18h32
  2. Probléme reception des données version android =>3.0
    Par ali douiri dans le forum Android
    Réponses: 0
    Dernier message: 28/05/2014, 02h12
  3. Réponses: 1
    Dernier message: 21/03/2007, 16h43
  4. [socket] reception des données.
    Par flocks dans le forum Réseau
    Réponses: 3
    Dernier message: 23/04/2006, 15h47
  5. Reception des données en paquet
    Par royrremi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/05/2004, 19h52

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