Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Call for Presentations - Qt World Summit

    Unsolved QTcpServer - different behvaior in debug & release

    General and Desktop
    qtcpserver network release mode
    2
    17
    4209
    Loading More Posts
    • 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.
    • R
      reezeus last edited by reezeus

      Hi there

      I'm using a QTcpServer to allow external connections to my program.
      When using in debug mode, everytime a new client connects, the signal "newConnection" of QTcpServer is called and everything works fine.
      When using in release mode, the signal is not called and hence clients cannot connect.
      This is even more surprising that it worked very well in previous release version, and I have not modified the class hosting the QTcpServer.

      The server class is as follow:
      @
      IPServer::IPServer(){
      server = new QTcpServer();
      if(!server->listen(QhostAdress::Any, 50869)){
      outApp.SendEmail("myEmail@outlook.com", "server did not start");
      }else{
      outApp.SendEmail("myEmail@outlook.com", "server started");
      connect(server, SIGNAL(newConnection()), this, SLOT(NewConnection()));
      }
      }
      @

      The slot "NewConnection" is called in debug but not in release. I receive the email "server started" in both debug and release.

      I'm using Qt 5.5.1 on Windows 7 & Qt Creator with mvsc2013 compiler.

      Can you provide some help please?

      Thanks

      1 Reply Last reply Reply Quote 0
      • mrjj
        mrjj Lifetime Qt Champion last edited by

        hi
        This is on the same PC?
        Its 100% sure its not firewall or scanner related?

        1 Reply Last reply Reply Quote 0
        • R
          reezeus last edited by

          Hi mrjj

          Clients and server are not on the same PC.
          If it was due to the firewall, I assume it would be the same issue in both debug & release?

          mrjj 1 Reply Last reply Reply Quote 0
          • mrjj
            mrjj Lifetime Qt Champion @reezeus last edited by mrjj

            @reezeus said:
            I mean when u run in release vs debug.
            same pc?

            Well the actual exe would be different so say the debug was "accepted" and release not.

            For some security solutions just the fact that is located in another folder would be
            enough.

            Its seems very odd so just asking if u tested with firewall off, just be sure.
            (NetSh Advfirewall set allprofiles state off)

            1 Reply Last reply Reply Quote 0
            • R
              reezeus last edited by

              Didn't get it right indeed: yes debug & release are both tested on the same PC.
              Both versions are in the same directory (the one created by default by Qt): one folder for the debug and one folder for release.
              Note that the issue arises before I deploy the app, i.e. just by starting the program from within the release folder.
              I have tried several clean/run qmake/build all.

              1 Reply Last reply Reply Quote 0
              • mrjj
                mrjj Lifetime Qt Champion last edited by

                What if u run directly in VS ?

                1 Reply Last reply Reply Quote 0
                • R
                  reezeus last edited by

                  I don't think I can run my Qt code in VS, I believe I first need to install the VS plugin for Qt?
                  I've never compiled Qt code with VS, I use Qt only with Qt creator.

                  mrjj 1 Reply Last reply Reply Quote 0
                  • mrjj
                    mrjj Lifetime Qt Champion @reezeus last edited by

                    @reezeus
                    Ok. well if u run from in Creator in release mode, it also does this?

                    1 Reply Last reply Reply Quote 0
                    • R
                      reezeus last edited by

                      Yes, same behavior..

                      mrjj 1 Reply Last reply Reply Quote 0
                      • mrjj
                        mrjj Lifetime Qt Champion @reezeus last edited by

                        @reezeus
                        can you reproduce this in small sample?
                        Might be a bug then.

                        1 Reply Last reply Reply Quote 0
                        • R
                          reezeus last edited by

                          Sure, will do this when I have some time. Where should I upload the files?

                          mrjj 1 Reply Last reply Reply Quote 0
                          • mrjj
                            mrjj Lifetime Qt Champion @reezeus last edited by

                            @reezeus
                            There is no upload function here.
                            I use dropbox as it very easy to share.

                            But if sample very small, its fine to post directly.

                            1 Reply Last reply Reply Quote 0
                            • R
                              reezeus last edited by reezeus

                              .h file:
                              #ifndef IPSERVER
                              #define IPSERVER
                              #define HEADER_FENSERVEUR

                              #include <QtWidgets>
                              #include <QtNetwork>
                              #include "emailoutlook.h"

                              class IPServer : public QWidget
                              {
                              Q_OBJECT

                              public:
                                  IPServer();
                                  void SendToAll(const QString &message);
                              
                              private slots:
                                  void NewConnection();
                                  void DataReceived();
                                  void DisconnectClient();
                              
                              private:
                                  EmailOutlook outApp;
                                  QTcpServer *server;
                                  QList<QTcpSocket *> clients;
                                  quint16 sizeMessage;
                              

                              };

                              #endif // IPSERVER

                              .cpp file:
                              #include "ipserver.h"

                              IPServer::IPServer()
                              {
                              outApp = EmailOutlook();
                              server = new QTcpServer(this);
                              if (!server->listen(QHostAddress::Any, 50869))
                              {
                              qDebug() << "Server cound not start" + server->errorString();
                              }
                              else
                              {
                              qDebug() << "Server has started on port " + QString::number(server->serverPort()) + ". Clients can now connect.";
                              connect(server, SIGNAL(newConnection()), this, SLOT(NewConnection()));
                              }

                              sizeMessage = 0;
                              

                              }

                              void IPServer::NewConnection()
                              {
                              //SendToAll("New Client connected");

                              QTcpSocket *newClient = server->nextPendingConnection();
                              clients << newClient;
                              SendToAll("New Client connected");
                              connect(newClient, SIGNAL(readyRead()), this, SLOT(DataReceived()));
                              connect(newClient, SIGNAL(disconnected()), this, SLOT(DisconnectClient()));
                              

                              }

                              void IPServer::DataReceived()
                              {
                              QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
                              if (socket == 0)
                              return;

                              QDataStream in(socket);
                              
                              if (sizeMessage == 0)
                              {
                                  if (socket->bytesAvailable() < (int)sizeof(quint16))
                                       return;
                              
                                  in >> sizeMessage;
                              }
                              
                              if (socket->bytesAvailable() < sizeMessage)
                                  return;
                              
                              QString message;
                              in >> message;
                              
                              SendToAll(message);
                              
                              sizeMessage = 0;
                              

                              }

                              void IPServer::DisconnectClient()
                              {
                              SendToAll("New client disconnected");

                              QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
                              if (socket == 0)
                                  return;
                              
                              clients.removeOne(socket);
                              socket->deleteLater();
                              

                              }

                              void IPServer::SendToAll(const QString &message)
                              {
                              QByteArray paquet;
                              QDataStream out(&paquet, QIODevice::WriteOnly);

                              out << (quint16) 0;
                              out << message;
                              out.device()->seek(0);
                              out << (quint16) (paquet.size() - sizeof(quint16));
                              
                              for (int i = 0; i < clients.size(); i++)
                              {
                                  clients[i]->write(paquet);
                              }
                              

                              }

                              The IPServer class is initialized from another class:
                              IPServer *myServer;
                              myServer = new IPServer();

                              1 Reply Last reply Reply Quote 0
                              • mrjj
                                mrjj Lifetime Qt Champion last edited by

                                ok.
                                This code can someone else run and see if it can reproduced on other pc?

                                1 Reply Last reply Reply Quote 0
                                • R
                                  reezeus last edited by

                                  I have recompiled on another PC with Qt version 5.5.0 (still mvsc2013 compiler) and it works fine; debug, release & deployed.

                                  mrjj 1 Reply Last reply Reply Quote 0
                                  • mrjj
                                    mrjj Lifetime Qt Champion @reezeus last edited by

                                    @reezeus said:
                                    so it seems to be Qt 5.5.1 related ?
                                    I dont have VS compiler so cant check here.

                                    1 Reply Last reply Reply Quote 0
                                    • R
                                      reezeus last edited by

                                      It could be. Although it was working fine in previous release with Qt 5.5.1.

                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post