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 :

Identification de QTcpSocket


Sujet :

Réseau

  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 Identification de QTcpSocket
    Bonjour,

    J'utilise un QTcpServer et des QTcpSocket, et vu que j'ai plusieurs sockets, je voudrais les identifier car selon la socket je réalise une action différente.
    Donc j'essaye d'écrire dans la socket après m'être connecté au server mais lorsque j'effectue des tests sur ce que je réceptionne cela ne fonctionne pas!
    J'ai essayé d'afficher le QByteArray qui est retourné par socket->read() mais il n'y a rien dedans ( "" ) !
    J'ai aussi essayé de le caster mais sans résultats.

    Si vous voulez plus d'informations, ou du code dites le moi.
    Ou des propositions différentes sur le sujet n'hésitez pas!

    Je vous remercie d'avance

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Pour du code, tu peux regarder les exemples d'utilisation de QTcpSocket et QTcpServer dans la doc de Qt

  3. #3
    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
    Même avec l'exemple Qt cela ne fonctionne pas! je pense que j'écris trop tôt dans la socket ! Pouvez vous me donnez votre avis ?!

    Voici mon côté client à partir duquel j'envoi
    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
     
    void ClientConfig::requestNewConnexion()
     {
    	 socket->abort();
         socket->connectToHost("127.0.0.1", 50885);
    	 if (socket->waitForConnected(2000000))		
    	 {
    		qDebug("Connected!");
    		sendData();
    	 }
    	 else
    		qDebug() << "socket error : " <<socket->errorString();
    		return;
     }
     
     void ClientConfig::sendData()
    {
         QByteArray block;
    	 QString str = "1";
         QDataStream out(&block, QIODevice::WriteOnly);
         out.setVersion(QDataStream::Qt_4_6);
         out << (quint16)0;
         out << str;
         out.device()->seek(0);
         out << (quint16)(block.size() - sizeof(quint16));
     
         socket->write(block);
         if(socket->flush())
    		qDebug("envoyé!");
    	 else
    		qDebug("erreur!");
     }
    et voici mon côté server qui récupère l'infos pour l'identification

    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
     
    void LocalServer::NewConnectionOnServer()
    {
        if(m_server->hasPendingConnections() == true)
    	{
    		if(cpt == 0)
    		{
    			client1 = new QTcpSocket;
    			client1 = m_server->nextPendingConnection();
    			qDebug() << "Nouvelle connexion sur le serveur 1";
    			cpt += 1;
    			VerifSocket(client1);
    			if(!m_server->waitForNewConnection(20000))
    			{
    				return;
    			}
    		}
             }
    }
     
    void LocalServer::VerifSocket(QTcpSocket* socketTest)
    {
    	 blockSize = 0;
     
    	 QDataStream in(socketTest);
         in.setVersion(QDataStream::Qt_4_6);
     
         if (blockSize == 0) {
             if (socketTest->bytesAvailable() < (int)sizeof(quint16))
                 return;
             in >> blockSize;
         }
     
         QString str;
         in >> str;
     
    	qDebug() << str;
     
    	if(str == "0")
    	{
    		if(socketTest == client1)
    		{
    		connect(socketTest,SIGNAL(readyRead()),this,SLOT(ReadOK1()));
    		connect(MessagingSystemSerial::getInstance(),SIGNAL(ConfigReceived()),this,SLOT(SendDataToClient1()));
    		}
            }
    }
    Je vous remercie d'avance !

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 63
    Par défaut
    Salut,

    Après la création de ta socket lors de la demande de connexion, tu as simplement à stocker ton client dans une liste.
    Bien évidement ce sera une QList<QTcpSocket*>
    Avec ceci, ton serveur aura en mémoire tous les clients avec qui il correspond.

    à +

  5. #5
    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
    Salut,

    Je suis d'accord avec toi mais en fait j'ai trois exe différent et comment je sais si le client1 correspond à l'exe1 ou 2 ou 3 ?

    car imaginons que l'ordre de connexion ne soit pas respecté nous aurons des problèmes pour la suite. Sinon si je respecte l'ordre ta méthode me parait simple et efficace

    Tu vois un peu ce que je veux ?

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 63
    Par défaut
    Tu peux aussi identifier tes clients avec un cast lorsqu'un signal parvient à ton serveur pour savoir qui lui parle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTcpSocket *Socket = qobject_cast<QTcpSocket *>(sender());
    Avec ça tu peux même afficher l'adresse IP de ton client avec la fonction peerAdress().

    Il y a pas mal d'exemples sur les communication QTcpSocket et QTcpServer sur le net ou même sur dvp.net

    Bon courage.

  7. #7
    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
    C'est bon j'ai résolu mon problème !

    Merci à tous ce qui mon aidé !

  8. #8
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par kek's Voir le message
    C'est bon j'ai résolu mon problème !

    Merci à tous ce qui mon aidé !
    Serait-il possible que tu expliques la solution à ton problème pour des futurs visiteurs plutôt que de donner un lien qui ne sera pas forcément permanent et peut donc devenir invalide.


  9. #9
    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
    Oui pas de problème !

    Le problème que j'avais était dû à un Thread qui tourné sur l'appli donc je l'aie enlevé et tout marche ! Mais comme ce Thread est important j'ai fait en sorte que les identifications soient faites dans un premier temps et dans un second temps lorsque toutes les sockets sont connectés, je lance mon thread de récupération de message.

    Voilà j'espère que c'est clair

    Si vous voulez plus de précision demandez-le moi !

    Merci à tous!

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

Discussions similaires

  1. [LG]Probleme sur l'identification de typage
    Par axelmeunier dans le forum Langage
    Réponses: 10
    Dernier message: 19/01/2004, 14h41
  2. Identification par ip
    Par Dante dans le forum Développement
    Réponses: 9
    Dernier message: 12/01/2004, 13h20
  3. probleme identification et mot de passe root
    Par freums dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2003, 18h09
  4. [servlet][identification][url]
    Par welty dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 20/08/2003, 10h10
  5. identification lettre (pb accent)
    Par scorbo dans le forum C
    Réponses: 5
    Dernier message: 14/12/2002, 03h59

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