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 :

Signal readyRead jamais émis


Sujet :

Réseau

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut Signal readyRead jamais émis
    bonjour
    voilà mon problème
    je travaille sur un projet de transfert de donnée avec acquitement
    des trames de data sont envoyées en udp et son acquité en tcp
    tout ce passe très bien pour la partie udp, le fichier est bien tranféré sans problème.
    j'en viens à la partie acquitement, chaque trame possède son propre crc , je calcule le crc de la trame reçu et si celui ci est différent de celui contenu dans la trame alors j'envoie un NOK en tcp
    pour faire ça
    du coté emetteur j'ai créer un serveur tcp, et le recepteur un client tcp
    le récepteur attend la connexion du client ,
    la détection de la connexion et déconnexion du client fonctionne très bien
    quand le client se connecte , je passe dans new connection et je recup la socket par nextpending truc muche
    sur cette socket je place un connect readyread pour lire les data
    mais quand mon client envoie les trace tcp je ne passe pas dans le slot correspodant au readyread
    en effectuant un scan avec wireshark je vois bien les datas tcp avec les valeurs

    je sus en qt 5.5 avec visual studio 2010 sous win7 64bit
    je ne vois pas ce que j'ai oublié
    merci pour votre aide

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Bonjour,

    Sans voir le code, difficile à dire.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    voici le code
    le cpp :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    #include "floatcomtcpsrv.h"
     
    FloatComTcpSrv::FloatComTcpSrv()
    {
        qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError" );
     
    }
     
    FloatComTcpSrv::~FloatComTcpSrv() {
        if (mFloatServer)
            delete(mFloatServer);
    }
     
    void FloatComTcpSrv::SrvSetting(QString pAdresse, int pPort)
    {
        mSrvAdresse = pAdresse;
        mSrvPort = pPort;
     
        qDebug() << "Config SrvTCP : adresse =" <<pAdresse << "  port = "<< pPort;
    }
     
    void FloatComTcpSrv::Launch()
    {
     
        mFloatServer = new QTcpServer();
        connect(mFloatServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
     
        mFloatServer->listen(QHostAddress(mSrvAdresse), mSrvPort);
     
     
    }
     
    void FloatComTcpSrv::acceptConnection()
    {
     
        mFloatUser = mFloatServer->nextPendingConnection();
        emit ConnectionState("connect");
        //demarrage du timer
        mTimerSocketNoData.start(60000);
        // init du timer sur reception de data
        connect(&mTimerSocketNoData, SIGNAL(timeout()), this, SLOT(Slot_clientDisconnected()));
     
     
        connect(mFloatUser, SIGNAL(readyRead()), this, SLOT(startRead()));
     
        connect(mFloatUser, SIGNAL( error( QAbstractSocket::SocketError ) ),
                            this, 	SLOT( erreurSocket( QAbstractSocket::SocketError ) ));
    }
     
    void FloatComTcpSrv::startRead()
    {
        QByteArray lReceiveData;
        lReceiveData = mFloatUser->readAll();
        mFloatUser->flush();
        qDebug() << "STOP STOP STOP";
        getchar();
     
        // on redemarre le timer pour 1 minute
        //mTimerSocketNoData.start(1000);
        // emission du signal pour l'ihm
        emit TransmitData(lReceiveData);
        qDebug() << "Reception TRAME ACK TCP :: " << lReceiveData.toHex();
     
    }
     
    void FloatComTcpSrv::Slot_clientDisconnected()
    {
        qDebug() << "TIME OUT RESTART";
        mFloatServer->close();
        //mise en ecoute
        mFloatServer->listen(QHostAddress(mSrvAdresse), mSrvPort);
    }
     
     
    void FloatComTcpSrv::erreurSocket(QAbstractSocket::SocketError pError)
    {
        switch( pError )
        {
            case QAbstractSocket::HostNotFoundError:
                qDebug() << "Erreur : le serveur n'a pas pu etre trouve. Verifiez l'IP et le port.";
                break;
            case QAbstractSocket::ConnectionRefusedError:
                qDebug() << "Erreur : le serveur a refuse la connexion ou n'est pas connecte.";
                mTimerSocketNoData.start();
                break;
            case QAbstractSocket::RemoteHostClosedError:
                qDebug() << "Erreur : le serveur a coupe la connexion.";
                mTimerSocketNoData.start();
                emit ConnectionState("disconnect");
                break;
            default:
                qDebug() << "Erreur : " << mFloatUser->errorString();
        }
    }


    le .h
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #ifndef FLOATCOMTCPSRV_H
    #define FLOATCOMTCPSRV_H
     
    #include <QObject>
    #include <QTcpSocket>
    #include <qtcpserver.h>
    #include <QAbstractSocket>
    #include <QUdpSocket>
    #include <QThread>
    #include <QTimer>
     
     
    class FloatComTcpSrv : public QObject
    {
     
        Q_OBJECT;
     
    public:
        FloatComTcpSrv();
        virtual ~FloatComTcpSrv();
     
        /**
         * \brief Méthode permettant de positionner les paramètres du serveur
         * \param pAdresse : adresse ip du serveur tcp
         * \param pPort : port d'ecoute du serveur tcp
         */
        void	SrvSetting(QString pAdresse, int pPort);
     
        /**
         * \brief Méthode pour le lancement du serveur en écoute
         */
        void 	Launch();
     
    public slots:
        /**
         * \brief Slot permettant d'accepter la demande de connection
         */
        void acceptConnection();
     
        /**
         * \brief Slot permettant de demarrer la lecture des données
         */
        void startRead();
     
        /**
         * \brief Slot permettant de signaler la deconnection du client
         */
        void Slot_clientDisconnected();
     
        /**
         * \brief Slot permettant de signaler des erreurs sur la socket tcp du serveur
         */
        void erreurSocket(QAbstractSocket::SocketError pError);
     
    public: signals:
     
        /**
         * \brief Signal emis contenant les données lues sur la socket
         * \param  QByteArray donnée présente sur le port de la socket tcp du serveur
         */
        void TransmitData(QByteArray);
     
        /**
         * \brief Signal emis ors du changement d'état de la connection
         * \param QString : etat de la connection ( ie connecté ou déconnecté )
         */
        void ConnectionState(QString);
     
    public:
        QTcpServer * mFloatServer;
        QTcpSocket * mFloatUser;
        QTimer		mTimerSocketNoData;
        QString 	mSrvAdresse;
        int			mSrvPort;
     
    };
     
    #endif // FLOATCOMTCPSRV_H
    l'appel
    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
     
     
    void FrameEmission::on_pushButtonMarche_clicked()
    {
     
        // socket UDP pour emission
        mSocketEmissionUDP  = new QUdpSocket(this);
        mSocketEmissionUDP->bind(QHostAddress(mConfigEmet.Ip_Udp_Boitier), mConfigEmet.Port_Udp);
        qDebug() << "UDP :: IP adresse : " << mConfigEmet.Ip_Udp_Boitier << "  port : " << mConfigEmet.Port_Udp;
     
        // socket serveur TCP pour acquitement trame
        mSocketServeurTCP = new FloatComTcpSrv();
        mSocketServeurTCP->SrvSetting(mConfigEmet.Ip_Tcp_Server_Ex,mConfigEmet.Port_TCP);
        mSocketServeurTCP->Launch();
     
        connect(mSocketServeurTCP, SIGNAL(ConnectionState(QString)), this, SLOT(Slot_SrvConnectionState(QString)));
        connect(mSocketServeurTCP, SIGNAL(TransmitData(QByteArray)), this, SLOT(Slot_AnalyseTrame(QByteArray)));
     
        qDebug() << "UDP :: IP adresse : " << mConfigEmet.Ip_Tcp_Server_Ex << "  port : " << mConfigEmet.Port_TCP;
     
     
    }
    la detection de la connexion et de la deconnexion du client fonctionne, toute la partie udp aussi, par contre dans ma classe je ne rentre jamais dans le slot startread associé au signal readyread
    est ce que j'ai oublié quelques choses ?

    merci

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    A première vue je ne vois pas d'erreur. Mais n'utilisant pas souvent le module Network, j'ai peux-être manquer qqch.
    Etes-vous bien sûre que des données sont bien reçues par le client et que le signal "readyRead()" est bien émis à un moment donné ?

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    oui sur le poste qui doit recevoir les trames TCP je les reçoit , en faisant une capture avec wireshark on voit tres bien les paquets emit du poste emetteur
    en effectuant des modifications j'ai trouvé une subtilité qui me permet de les recevoir mais que je n'explique pas
    au niveau du slot startread j'ai décallé le flush
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void FloatComTcpSrv::startRead()
    {
        QByteArray lReceiveData;
        lReceiveData = mFloatUser->readAll();
         // on redemarre le timer pour 1 minute
        //mTimerSocketNoData.start(1000);
        // emission du signal pour l'ihm
        emit TransmitData(lReceiveData);
        qDebug() << "Reception TRAME ACK TCP :: " << lReceiveData.toHex();
        mFloatUser->flush(); 
    }
    si quelqu'un à une idée pour m'expliquer , c'est comme s'il y avait un accés concurrentiel dans la première méthode

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Je ne comprend pas. Comment le fait de modifier le code à l'intérieur du slot pourrait avoir un influence sur son appel ?
    Cela n'as pas trop de sens. N'est-ce pas plutôt l'appel à getChar() qui posait problème et bloquait la boucle d'événement ?

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut
    je ne pense pas car le getchar() est apres un qdebug() je devrait au moins voir le message du qdebug

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/07/2013, 08h25
  2. Réponses: 4
    Dernier message: 30/04/2013, 18h57
  3. ASP .NET 2.0 mon fichier js n'est jamais mis en cache !
    Par hardballer dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/12/2010, 10h47
  4. Réponses: 6
    Dernier message: 04/11/2009, 10h57
  5. objet hibernate jamais mis a jour
    Par allstar dans le forum Hibernate
    Réponses: 3
    Dernier message: 01/09/2006, 17h07

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