Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. No reception of NewConnection signal

No reception of NewConnection signal

Scheduled Pinned Locked Moved General and Desktop
13 Posts 2 Posters 7.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    cyte13
    wrote on last edited by
    #1

    Hi everyone,

    As a training, i wrote a server/client application:

    • A server exe, using my own class derivated from QTcpServer. Like examples, after listening on port, I connect signal newConnection with a slot (printing text to confirm a connection).
    • A client exe, using my own class derivated from QTcpSocket. After the connection with server, I connect the signal connected() with my own slot( printint text to confirm connection to the server).

    => At execution, for cleint side, I have my printed text confirming the connection : connected() signal correctly treaten and redirected.
    For server side, nothing printed and in a debug, I notice that my slot is not called : the signal newConnection is not interceped....

    Rk: It works once if only after the listenning function I call WaitForNewConnection() long enough for a client to connect on server before the end of wait time.....

    Has someone an idea of the reason why I don't intercept the newConnection() signal?

    Thanks a lot,

    Cyte13

    1 Reply Last reply
    0
    • T Offline
      T Offline
      tony
      wrote on last edited by
      #2

      A connection to newConnection() signal is all you need, after listen.

      Can you post your code (not all, just the network part)?

      1 Reply Last reply
      0
      • C Offline
        C Offline
        cyte13
        wrote on last edited by
        #3

        Thanks for your reply, it is what I think, but doesn' work...
        Here is the threated version one:

        I have my own CGameEngine class derivated from QThread which has as a member a pointeur to another class CGameEngineServer which derivated from QTcpServer:

        GAMEENGINE:
        @
        class GAMEENGINE_EXPORT CGameEngine : public QThread
        {
        Q_OBJECT
        public:
        /** Constructeur par défaut */
        CGameEngine(QObject *parent = 0);

        /** Destructeur */
        ~CGameEngine();
        
        /** 
            StartProcess    :    Lance le serveur de jeu local et gère la partie
            engineport        :    Port d'écoute du serveur local de jeu
            placeavailable    :    Nombre maximum de joueur à la table
            RETURN            :    GAMEENGINE_CORRECT ou GAMEENGINE_ERREUR
        **/
        void StartProcess(quint16 engineport, int placeavailable);
        
        void run();
        

        private:
        //CComEngineBDD* MyComEngineBDD;
        CGameEngineServer* MyEngineServer;
        ...

        void CGameEngine::StartProcess(quint16 engineport, int placeavailable)
        {
        m_engineport = engineport;
        m_MaxPlayer = placeavailable;

        start();
        

        }

        void CGameEngine::run()
        {
        /* Create the server object /
        MyEngineServer = new CGameEngineServer();
        /
        Start listenning on port in arg /
        if (!MyEngineServer->Listen(m_engineport)) exit();
        /
        Connect signals between MyEngineServer and this to specify processes at a new incoming message */
        QObject::connect(MyEngineServer, SIGNAL(MessageToRead(QString)), this, SLOT(MessageToRead(QString)));
        exec();
        }
        @
        GAMEENGINESERVER:
        @
        class GAMENETWORK_EXPORT CGameEngineServer : public QTcpServer
        {
        Q_OBJECT

        public:
        CGameEngineServer(QObject *parent = 0);

        bool Listen(quint16 port);
        void Close();
        

        protected:
        //void incomingConnection(int socketDescriptor);

        private:
        QVector<QTcpSocket*> m_VectorClient;
        quint16 tailleMessage;

        signals:
        void MessageToRead(QString);

        public slots:
        void NewConnection();
        void ReadMessage();
        };

        bool CGameEngineServer::Listen(quint16 port)
        {
        bool result = listen(QHostAddress::LocalHost, port);
        if (result)
        {
        printf("Local Game Engine Server listenning on port %d...\n", port);
        /* make connection for a new connction */
        QObject::connect(this, SIGNAL(newConnection()), this, SLOT(NewConnection()));
        }
        else
        {
        printf("Unable for Local Game Engine Server to listen on port %d...\n", port);
        }
        return result;
        }

        @

        and now the call to StartProcess :
        @
        int main(int argc, char *argv[])
        {
        QCoreApplication a(argc, argv);
        CGameEngine MyGameEngine;
        MyGameEngine.StartProcess(8500, 2);

        return a.exec&#40;&#41;;
        

        }
        @

        1 Reply Last reply
        0
        • T Offline
          T Offline
          tony
          wrote on last edited by
          #4

          Well, I've tried your code in my PC ... and it works :)

          Just a strange thing, but it's not dependent on your code. Qt Creator does not show printf messages in "Application Output". But if you launch your program in a console, you'll see the message (I put a printf in NewConnection slot).

          1 Reply Last reply
          0
          • T Offline
            T Offline
            tony
            wrote on last edited by
            #5

            Btw ... use qDebug() function to show message in Application Output ...

            1 Reply Last reply
            0
            • C Offline
              C Offline
              cyte13
              wrote on last edited by
              #6

              all my printf worked fine but NewConnection...
              As an example, at the start of listenning : printf("Local Game Engine Server listenning on port %d...\n", port); => works fine in the console....

              1 Reply Last reply
              0
              • T Offline
                T Offline
                tony
                wrote on last edited by
                #7

                Well, your server starts fine (as netstat shows...)

                I just make a "telnet 127.0.0.1 8500" and a NEW CONNECTION!!! (my message) appears.

                Firewall? Do you connect to 127.0.0.1 and port 8500? I cannot see any other problem ...

                1 Reply Last reply
                0
                • C Offline
                  C Offline
                  cyte13
                  wrote on last edited by
                  #8

                  I desactived the firewall but nothing changed.
                  What is strang is that the client correctly onnects to the server and intercepts the connected() signal.
                  Moreover, I need to put the WaitForNewConnection() to be able to intercept newConnection() signal....

                  1 Reply Last reply
                  0
                  • C Offline
                    C Offline
                    cyte13
                    wrote on last edited by
                    #9

                    telnet succeced in connecting to the server but still nothing in new connection!!!!

                    1 Reply Last reply
                    0
                    • T Offline
                      T Offline
                      tony
                      wrote on last edited by
                      #10

                      well, the only thing left is that I can post my code and you'll check for any diff ...

                      @
                      #ifndef GAMESERVER_H
                      #define GAMESERVER_H

                      #include <QtCore>
                      #include <QtNetwork>

                      class CGameEngineServer;

                      class CGameEngine : public QThread
                      {
                      Q_OBJECT

                      quint16 m_engineport;
                      

                      public:
                      /** Constructeur par défaut */
                      CGameEngine(QObject *parent = 0) : QThread(parent), MyEngineServer(0) { }

                      /** Destructeur */
                      ~CGameEngine() { }
                      
                      /**
                          StartProcess    :    Lance le serveur de jeu local et gère la partie
                          engineport        :    Port d'écoute du serveur local de jeu
                          placeavailable    :    Nombre maximum de joueur à la table
                          RETURN            :    GAMEENGINE_CORRECT ou GAMEENGINE_ERREUR
                      **/
                      void StartProcess(quint16 engineport, int placeavailable);
                      
                      void run();
                      

                      private:
                      CGameEngineServer* MyEngineServer;
                      };

                      class CGameEngineServer : public QTcpServer
                      {
                      Q_OBJECT

                      public:
                      CGameEngineServer(QObject *parent = 0) : QTcpServer(parent) { }

                      bool Listen(quint16 port);
                      void Close();
                      

                      protected:
                      //void incomingConnection(int socketDescriptor);

                      private:
                      QVector<QTcpSocket*> m_VectorClient;
                      quint16 tailleMessage;

                      signals:
                      void MessageToRead(QString);

                      public slots:
                      void NewConnection() { printf("NEW CONNECTION!!!\n"); }
                      void ReadMessage() { }
                      };

                      #endif // GAMESERVER_H
                      @

                      @
                      #include "gameserver.h"

                      void CGameEngine::StartProcess(quint16 engineport, int placeavailable)
                      {
                      m_engineport = engineport;
                      // m_MaxPlayer = placeavailable;

                      start();
                      

                      }

                      void CGameEngine::run()
                      {
                      /* Create the server object /
                      MyEngineServer = new CGameEngineServer();
                      /
                      Start listenning on port in arg /
                      if (!MyEngineServer->Listen(m_engineport)) exit();
                      /
                      Connect signals between MyEngineServer and this to specify processes at a new incoming message */
                      QObject::connect(MyEngineServer, SIGNAL(MessageToRead(QString)), this, SLOT(MessageToRead(QString)));
                      exec();
                      }

                      bool CGameEngineServer::Listen(quint16 port)
                      {
                      bool result = listen(QHostAddress::LocalHost, port);
                      if (result)
                      {
                      printf("Local Game Engine Server listenning on port %d...\n", port);
                      /* make connection for a new connction */
                      QObject::connect(this, SIGNAL(newConnection()), this, SLOT(NewConnection()));
                      }
                      else
                      {
                      printf("Unable for Local Game Engine Server to listen on port %d...\n", port);
                      }
                      return result;
                      }
                      @

                      @
                      #include <QtCore/QCoreApplication>

                      #include "gameserver.h"

                      int main(int argc, char *argv[])
                      {
                      QCoreApplication a(argc, argv);
                      CGameEngine MyGameEngine;
                      MyGameEngine.StartProcess(8500, 2);

                      return a.exec&#40;&#41;;
                      

                      }
                      @

                      I hope that this will help you solve your problem ...

                      1 Reply Last reply
                      0
                      • C Offline
                        C Offline
                        cyte13
                        wrote on last edited by
                        #11

                        not better.....
                        The only difference between your code and mine is that the CGameEngine and CGameEngineServer are available via a library (ifdef GAMENETWORK_LIB

                        define GAMENETWORK_EXPORT Q_DECL_EXPORT

                        #else

                        define GAMENETWORK_EXPORT Q_DECL_IMPORT

                        #endif)

                        ==> May cause the issue?

                        1 Reply Last reply
                        0
                        • T Offline
                          T Offline
                          tony
                          wrote on last edited by
                          #12

                          I don't think so ... well, you can try :)

                          1 Reply Last reply
                          0
                          • C Offline
                            C Offline
                            cyte13
                            wrote on last edited by
                            #13

                            I progress...
                            When removing all classes access by library and directly insert .h and .cpp files into my app folder, it workd fine!!!!

                            Thanks a lot.

                            But... I would like to understand why it does not work when using StartProcess from the CGameEngine got from a library...!!!!

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved