QtNetwork: Why don't I detect incomming connections ? (incomingConnection() is never fired)



  • I sticked to the tutorial about threaded qt-networking (which is here: http://doc.qt.io/qt-5/qtnetwork-threadedfortuneserver-example.html), I made some minor changes and integrated it into my main program. However incomingConnection() never gets executed, on the other hand the client is able to connect. Since I'd like to work with incomingConnection() it became obsolete to work with the SIGNAL(newConnection()) but even this isn't working.

    Somebody knows what's going wrong?

    Here my .h

    #include <QtNetwork>
    #include <QTcpServer>
    #include <QTcpSocket>
    #include <QThread>
    
    class WirelessNetThread: public Thread
    {
    	Q_OBJECT
    
    public:
    	WirelessNetThread(int socketDescriptor, QObject * parent);
    
    	void run() Q_DECL_OVERRIDE;
    
    signals:
    	void error(QTcpSocket::SocketError socketError);
    
    private:
    	int socketDescriptor;
    	QString text;
    };
    
    class WirelessNet : public QTcpServer
    {
    	Q_OBJECT
    
    public:
    	WirelessNet(QObject *parent = 0);
    
    protected:
    	void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
    
    };
    

    And the .cpp

    WirelessNetThread::WirelessNetThread(int socketDescriptor, QObject *parent):QThread(parent), socketDescriptor(socketDescriptor)
    {
    }
    
    void WirelessNetThread::run()
    {
    	QTcpSocket tcpSocket;
    	if ( !tcpSocket.setSocketDescriptor(socketDescriptor))
    	{
    		emit error(tcpSocket.error());
    		return;
    	}
    
    	tcpSocket.disconnectFromHost();
    	tcpSocket.waitForDisconnected();
    }
    
    WirelessNet::WirelessNet(QObject *parent): QTcpServer(0)
    {
    	listen(QHostAddress::Any, 5220);
    	printf("is listening %d\n", this->isListening());
    }
    
    void WirelessNet::incomingConnection(qintptr socketDescriptor)
    {
    	qDebug() << "incomming \n";
    	printf("incomming \n");
    	WirelessNetThread *thread = new WirelessNetThread(socketDescriptor, this);
    	connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    	thread->start();
    }
    

    here the excerpt out of my main program, where it is initiated (by the way it doesn't matter if I leave out moveToThread():

    WirelessNet* wifi = new WirelessNet(this->parent());
    wifi->moveToThread(this->thread());
    

    Even this has no influence if I add these lines after the initalization of wifi:

    wifi = new WirelessNet(this->parent());
    QEventLoop testLoop;
    testLoop.exec();
    

    In other words "incomming" is never printed out, and so I'm not able to work on. Has anyone an idea, this is pretty much 1:1 the code from the tutorial that's what confuses me.

    Kind Regards



  • nobody knows about this strange Qt-behavior ?


  • Qt Champions 2017

    @QtExchange
    What's the debug output? Do you mind uploading the whole piece of code, as this:

    WirelessNet* wifi = new WirelessNet(this->parent());
    wifi->moveToThread(this->thread());
    

    doesn't mean much to me without knowing what this is ... neither does the following snippet:

    wifi = new WirelessNet(this->parent());
    QEventLoop testLoop;
    testLoop.exec();
    

    (same reason, plus I can't fathom why QEventLoop is needed).

    If I had to guess, possibly this:

    listen(QHostAddress::Any, 5220);
    

    shouldn't be in the constructor, but probably would work anyway.

    PS.
    That (fortune teller) example should really, really be removed from the documentation ... or at least rewritten ...



  • It is working now and the reason was the listen() was in the wrong position and you need an additional Signal/Slot connection from main program to the network extension as following:

    the main program gets changed like this:

    wifi= new WirelessNet(0);
    QThread *thread = new QThread;
    wifi->moveToThread(thread);
    connect(thread,SIGNAL(started()), wifi,SLOT(initWifi()));
    thread->start();
    

    the constructor of WirelessNet is now empty, therefore it gets a new public slot function:

    void WirelessNet::initWifi()
    {
    	listen(QHostAddress::Any, 5220);
    }
    

    And that's the trick.

    If one is creating a WirelessNet-Instance, starts listenting inside the constructor but first then uses the movetoThread(), the connection is lost.

    Concluding in one sentence: First move to the right thread and afterwards start listening

    Thanks for your help. Let me tell you I hate the official Qt-""Tutorials""


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.