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. [solved] "Connection Refused" error when TcpServer is moved into the mainwindow class
Forum Updated to NodeBB v4.3 + New Features

[solved] "Connection Refused" error when TcpServer is moved into the mainwindow class

Scheduled Pinned Locked Moved General and Desktop
5 Posts 2 Posters 4.8k Views 1 Watching
  • 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.
  • K Offline
    K Offline
    kpks
    wrote on last edited by
    #1

    Hi,
    I started my threaded server application by first setting up the server in the main class, and setting up the listen port. The listen port launches a thread to handle incoming data. Everything worked perfectly.

    I decided to move the server into the mainwindowui class, since the server needs to be set up only if the user decides to start a training session. Qt side everything sets up correctly but my embedded client complaints "Error Connecting: Connection Refused".

    Is it verboten to launch a thread from the UI? Is that the issue?

    If that is correct and I want to wait to launch the server, do I need to setup a signal-slot connection? Signal says to set up listener, server sets up listener?

    My next step is launching another window where the incoming TCP Data is plotted. How do I connect the socket thread to the plot window?

    @#include <QMainWindow>
    #include <QtWidgets>
    #include "cprServer.h"
    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    private slots:
    void on_quitButton_clicked();

    void on_pbFiles_clicked();
    

    private:
    void setUpListener();
    Ui::MainWindow *ui;
    cprServer server;
    };

    #ifndef CPRSERVER_H
    #define CPRSERVER_H

    #include <QStringList>
    #include <QTcpServer>

    class cprServer : public QTcpServer
    {
    Q_OBJECT

    public:
    cprServer(QObject *parent = 0);

    protected:
    void incomingConnection(qintptr socketDescriptor);

    private:
    QStringList datahandler;
    };

    #endif // CPRSERVER_H
    #ifndef LISTENWRITETHREAD_H
    #define LISTENWRITETHREAD_H
    #include <QThread>
    #include <QTcpSocket>

    class listenWriteThread : public QThread
    {
    Q_OBJECT

    public:
    listenWriteThread(int socketDescriptor, const QString &fortune, QObject *parent);

    void run();
    

    public slots:
    void analyzeThis();
    signals:
    void error(QTcpSocket::SocketError socketError);

    private:
    QTcpSocket* tcpSocket;
    int socketDescriptor;
    QString text;
    };@

    I have only added the header files because the functions work, it is just this set up of window calling server that is not working.
    Thanks!

    1 Reply Last reply
    0
    • dheerendraD Offline
      dheerendraD Offline
      dheerendra
      Qt Champions 2022
      wrote on last edited by
      #2

      ConnectionRefused means that your server socket is not started at all. Please check that. Hope your setupListener is called and initialized before you send the request for connection. In summary serverSocket should be ready before any incoming request come. If you give your complete sample I can suggest you what is the issue.

      Also there is no restriction from where you create thread. You can create from wherever you want.

      Dheerendra
      @Community Service
      Certified Qt Specialist
      http://www.pthinks.com

      1 Reply Last reply
      0
      • K Offline
        K Offline
        kpks
        wrote on last edited by
        #3

        Hi,
        This is my MainWindow Code:
        @#include "mainwindow.h"
        #include "ui_mainwindow.h"
        #include "cprserver.h"
        MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
        {
        ui->setupUi(this);

        //connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
        

        }

        MainWindow::~MainWindow()
        {
        delete ui;
        }

        void MainWindow::on_quitButton_clicked()
        {
        close();
        }

        void MainWindow::on_pbFiles_clicked()
        {
        // setUpListener();
        const QString IP = "127.0.0.1";
        const ushort port = 8100;
        QHostAddress host;
        cprServer server;
        host.setAddress(IP);
        if (!server.listen(host,port)) {
        QMessageBox::critical(this, tr("CPR Server"),
        tr("Unable to start the server: %1.")
        .arg(server.errorString()));
        close();
        //qDebug() << "Unable to start server" << server.errorString();

        }
        
        QString ipAddress=(server.serverAddress()).toString();
        qDebug () << "Server started at " << ipAddress ;
        qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
        

        }@

        I print the Server Started message to ensure the server was started. And this does happen every time I click on the pbFiles button.

        My server and thread classes:
        @#include "cprserver.h"

        #include "cprserver.h"
        #include "listenwritethread.h"

        #include <stdlib.h>

        cprServer::cprServer(QObject *parent)
        : QTcpServer(parent)
        {
        }

        void cprServer::incomingConnection(qintptr socketDescriptor)
        {
        QString fortune = "One Fine Day!";
        listenWriteThread *thread = new listenWriteThread(socketDescriptor, fortune, this);
        //connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
        thread->start();
        }
        #include "listenwritethread.h"

        #include <QtNetwork>

        listenWriteThread::listenWriteThread(int socketDescriptor, const QString &fortune, QObject *parent)
        : QThread(parent), socketDescriptor(socketDescriptor), text(fortune)
        {
        tcpSocket = new QTcpSocket;
        tcpSocket->setSocketDescriptor(socketDescriptor);

        }

        void listenWriteThread::run()
        {
        //qDebug()<<"Inside RUN!";
        /if (!tcpSocket->setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocket->error());
        return;
        }
        else qDebug()<<"Ready to Roll";
        /
        //qDebug()<<"Connection Up!";
        connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(analyzeThis()));
        }

        void listenWriteThread::analyzeThis()
        {
        //QTcpSOcket tcpSocket;
        //qDebug()<<"In Analyze!";
        QByteArray data = tcpSocket->readAll();
        QString sData=QString(data);
        QStringList dataList = sData.split(':');
        if ((dataList.size() >= 2) && dataList[0]=="Disp")
        {
        bool ok;
        int val = dataList[3].toInt(&ok,10);
        qDebug() << " Compression Depth " << val;
        }
        else
        qDebug() << "Data Error ! " << data;
        }@

        When I ran these classes as part of main, I succesfully connected and received data. The errors started only after I moved server to mainwindow class.

        Thanks!

        1 Reply Last reply
        0
        • dheerendraD Offline
          dheerendraD Offline
          dheerendra
          Qt Champions 2022
          wrote on last edited by
          #4
          cprServer server;
          

          THis is local stack variable. This will delete once the function is complete. CHange the same to heap variable

          cprServer *server = new     cprServer
          

          Then work on this.

          Dheerendra
          @Community Service
          Certified Qt Specialist
          http://www.pthinks.com

          1 Reply Last reply
          0
          • K Offline
            K Offline
            kpks
            wrote on last edited by
            #5

            Oh thank you thank you thank you so much!

            I had already made cprServer a private variable in the windows class, but, when I cut and paste code from the main.cpp file I repeated the cprServer declaration and inadvertently made the server a local variable.

            I never considered this error because I only saw cprServer server declared in the mainwindow class. I was absolutely blind to the local declaration in the slot function!

            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