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. Qtcpclient in "wait for connected" loop and reconnect after connection breaks
Forum Updated to NodeBB v4.3 + New Features

Qtcpclient in "wait for connected" loop and reconnect after connection breaks

Scheduled Pinned Locked Moved General and Desktop
2 Posts 2 Posters 6.1k 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.
  • S Offline
    S Offline
    safrano
    wrote on last edited by
    #1

    hi,
    because i dont know who starts first: my qt programm(tcp client) or the tcp server,
    i take care of the case that the client programm starts first.

    so i have a runtime which tries to connect, and if fails (error-method), it starts (the init-method) again.
    this works well for the first connection, but, when the connection is broken, it doesn't reconnect,
    it doesn't start the "try-to-connect"-loop again.

    any ideas?

    tcpclient.h
    @
    #ifndef TCPCLIENT_H
    #define TCPCLIENT_H

    #include <QObject>
    #include <QTcpSocket>
    #include <QDebug>
    #include <QAbstractSocket>
    #include <QDateTime>
    #include <QString>
    #include <QFile>
    #include <QString>
    #include <QTextStream>

    class tcpclient : public QObject
    {
    Q_OBJECT
    public:
    explicit tcpclient(QObject *parent = 0);
    QTcpSocket *tcp_client_socket;

    signals:
    void sig_client_verbunden();
    void sig_client_verbunden_un();

    private slots:
    void client_error();
    void client_connected();
    void client_disconnected();

    public slots:
    void init();
    };

    #endif // TCPCLIENT_H
    @

    tcpclient.cpp
    @
    #include "tcpclient.h"

    tcpclient::tcpclient(QObject *parent) :
    QObject(parent)
    {
    tcp_client_socket = new QTcpSocket(this);
    }

    void tcpclient::init(){
    qDebug() << "init";
    tcp_client_socket->disconnect();
    tcp_client_socket->disconnectFromHost();
    connect(tcp_client_socket,SIGNAL(connected()), this, SLOT(client_connected()));
    connect(tcp_client_socket,SIGNAL(disconnected()),this,SLOT(client_disconnected()));
    connect(tcp_client_socket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(client_error()));
    tcp_client_socket->connectToHost("127.0.0.1",77);
    }

    void tcpclient::client_connected()
    {
    qDebug() << "DEBUG: R->G: VERBUNDEN ALS CLIENT!";
    emit sig_client_verbunden();
    }

    void tcpclient::client_disconnected()
    {
    qDebug() << "DEBUG: R->G: DISCONNECTED!";
    emit sig_client_verbunden_un();

    }

    void tcpclient::client_error()
    {
    qDebug() << "DEBUG: R->G: ERROR!";
    emit sig_client_verbunden_un();
    init();
    }
    @

    so what happens after the connection is broken:
    the error signal is emitted so the client_error() method runs one time, and it launches the init() method.
    (i know because of qDebug() output)
    but then finish.
    i dont know why it doesn't go to client_error() again, after failing.

    thanks a lot

    PS:
    i create one object from this class inside my main-ui-class:
    first i initiate it in the heap with new,
    than i make connections to the signals,
    and then i initialise it with
    tcpclient->init();

    like this no problems with the signals ( that i don't catch the connection one, because its emmited before the connection of signals and slots is made)

    1 Reply Last reply
    0
    • K Offline
      K Offline
      KA51O
      wrote on last edited by
      #2

      you need something like this in your init slot:

      @
      connect(tcp_client_socket, SIGNAL(error(QAbstractSocket::SocketError )), this,
      SLOT(HandleTcpError(QAbstractSocket::SocketError)))
      @

      and in the handleTcpError(..) slot you can then check the error and depending on the error try to reconnect

      @
      void tcpclient::handleTcpError(QAbstractSocket::SocketError a_socketError)
      {
      if(tcp_client_socket)
      {
      qDebug() << QString("tcpclient::handleTcpError: %1").arg(tcp_client_socket->errorString());
      }
      ReleaseConnection();
      // Try to reconnect after 5 seconds
      QTimer::singleShot(5000, this, SLOT(init()));
      }

      void tcpclient::releaseConnection()
      {
      if (!tcp_client_socket)
      return;

      if (tcp_client_socket->isValid())
      tcp_client_socket->disconnectFromHost();

      //disconnect all signal->slot connections related to your socket

      tcp_client_socket->deleteLater();
      tcp_client_socket = 0;
      }
      @

      For this to work you need to create your tcp socket in the init() slot and not in the constructor. something like this:
      @
      if(!tcp_client_socket)
      {
      tcp_client_socket = QTcpSocket(this);
      //do all the connect calls
      }
      @

      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