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. QTcpSocket doesn't emit the signal ReadyRead()
Forum Updated to NodeBB v4.3 + New Features

QTcpSocket doesn't emit the signal ReadyRead()

Scheduled Pinned Locked Moved Solved General and Desktop
qtcpsocketqtcpserverqthread
3 Posts 2 Posters 4.4k 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.
  • DoohamD Offline
    DoohamD Offline
    Dooham
    wrote on last edited by
    #1

    Hello,
    Few days ago I have a trouble implementing a MultiClient Server, but finally I could solve my trouble (here is the link for the previous thread:https://forum.qt.io/topic/101298/qsocketnotifier-socket-notifiers-cannot-be-enabled-or-disabled-from-another-thread/23)
    However, since I found the solution, I have been having other trouble: My goal is implenting a code for a Multiclient server that can read the messages from a device (A Pixhawk, is a device that is continously sending messages in form of package). With these messages group in form of QByteArray, I send this QbyteArray to my clients (programs that can decode the message and extract the information that the Pixhawk is trying to transmit). However I need to implement otrher function: i need to send a message from my client to the Pixhawk.
    I made a client code that I know it can send and receive messages from a server (I prove it with a server code that I made and just can handle one connection and it also works with a multiclient server with the error that I had), so I think the trouble is in the solution that I found for my Server code.
    This is my code (it's a bit different that the code from my previous thread):

    server.cpp

    #include "myserver.h"
    
    
    MyServer::MyServer(QObject *parent) : QTcpServer (parent)
    {
    
    }
    
    void MyServer::startServer()
    {
        if(!this->listen(QHostAddress::Any, 9999)){
    qDebug()<<"Server not started";
        }else {
    qDebug()<<"Server listening";
        }
    }
    
    void MyServer::startSerialPort()
    {
       mipuerto2 = new MySerialPort;
      connect(mipuerto2, SIGNAL(msgChanged(QByteArray*)), this, SLOT(getMens(QByteArray*)));
       mipuerto2->openSerialPort();
    }
    
    void MyServer::getMens(QByteArray*array)
    {
    
    
    
        emit mensChanged(array);
    }
    
    void MyServer::sendMens(QByteArray *arraySend)
    {
    mipuerto2->writeMsg(*arraySend);
    }
    
    
    void MyServer::incomingConnection(int socketDescriptor)
    {
    
    qDebug()<<socketDescriptor<<"Connecting... ";
    
    socket = new MySocket(socketDescriptor);
    QThread *thread = new QThread;
    qDebug()<<thread->currentThreadId();
    connect(this, SIGNAL(mensChanged(QByteArray*)), socket, SLOT(getMsg(QByteArray*)));
    
    connect(socket, SIGNAL(mensajeEnviarSocket(QByteArray*)), this, SLOT(sendMens(QByteArray*)));
    connect(socket, SIGNAL(disconnected()),thread, SLOT(quit()) );
    connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    connect(thread, SIGNAL(started()), socket, SLOT(funcionamiento()));
    
    socket->moveToThread(thread);
    thread->start();
    
    
    
    }
    

    mysocket.cpp

    #include "mysocket.h"
    
    MySocket::MySocket(int socketDescriptor)
    {
    ID=socketDescriptor;
    }
    
    void MySocket::leerMsg()
    {
        qDebug()<<"Mensaje entrante";
        msgSend="";
       socket->waitForReadyRead(100);
        msgSend=socket->readAll();
    
        qDebug()<<msgSend.toHex();
        emit mensajeEnviarSocket(&msgSend);
    }
    
    void MySocket::funcionamiento()
    {
        socket= new QTcpSocket;
        estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
        connect(this, SIGNAL(disconnected()), this, SLOT(desconexion()));
        connect(this, SIGNAL(readyRead()), this, SLOT(leerMsg()));
        qDebug()<<"Hola";
    }
    
    void MySocket::desconexion()
    {
       socket->close();
       socket->deleteLater();
    }
    
    void MySocket::getMsg(QByteArray *array)
    {
    if(socket->waitForConnected(1000)){
        arr=*array;
        socket->write(arr);
        socket->flush();
        socket->waitForBytesWritten(3000);
    }
    }
    
    

    I know that the troble is that the signal ReadyRead() is not emitted when I receive a new package of data from the client. As I said, I know that the client send the messages propertly; so I think that the trouble is with the class MySocket that don't work propertly. I have been the last hourse trying to find a solution.

    K 1 Reply Last reply
    0
    • DoohamD Dooham

      Hello,
      Few days ago I have a trouble implementing a MultiClient Server, but finally I could solve my trouble (here is the link for the previous thread:https://forum.qt.io/topic/101298/qsocketnotifier-socket-notifiers-cannot-be-enabled-or-disabled-from-another-thread/23)
      However, since I found the solution, I have been having other trouble: My goal is implenting a code for a Multiclient server that can read the messages from a device (A Pixhawk, is a device that is continously sending messages in form of package). With these messages group in form of QByteArray, I send this QbyteArray to my clients (programs that can decode the message and extract the information that the Pixhawk is trying to transmit). However I need to implement otrher function: i need to send a message from my client to the Pixhawk.
      I made a client code that I know it can send and receive messages from a server (I prove it with a server code that I made and just can handle one connection and it also works with a multiclient server with the error that I had), so I think the trouble is in the solution that I found for my Server code.
      This is my code (it's a bit different that the code from my previous thread):

      server.cpp

      #include "myserver.h"
      
      
      MyServer::MyServer(QObject *parent) : QTcpServer (parent)
      {
      
      }
      
      void MyServer::startServer()
      {
          if(!this->listen(QHostAddress::Any, 9999)){
      qDebug()<<"Server not started";
          }else {
      qDebug()<<"Server listening";
          }
      }
      
      void MyServer::startSerialPort()
      {
         mipuerto2 = new MySerialPort;
        connect(mipuerto2, SIGNAL(msgChanged(QByteArray*)), this, SLOT(getMens(QByteArray*)));
         mipuerto2->openSerialPort();
      }
      
      void MyServer::getMens(QByteArray*array)
      {
      
      
      
          emit mensChanged(array);
      }
      
      void MyServer::sendMens(QByteArray *arraySend)
      {
      mipuerto2->writeMsg(*arraySend);
      }
      
      
      void MyServer::incomingConnection(int socketDescriptor)
      {
      
      qDebug()<<socketDescriptor<<"Connecting... ";
      
      socket = new MySocket(socketDescriptor);
      QThread *thread = new QThread;
      qDebug()<<thread->currentThreadId();
      connect(this, SIGNAL(mensChanged(QByteArray*)), socket, SLOT(getMsg(QByteArray*)));
      
      connect(socket, SIGNAL(mensajeEnviarSocket(QByteArray*)), this, SLOT(sendMens(QByteArray*)));
      connect(socket, SIGNAL(disconnected()),thread, SLOT(quit()) );
      connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
      connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
      connect(thread, SIGNAL(started()), socket, SLOT(funcionamiento()));
      
      socket->moveToThread(thread);
      thread->start();
      
      
      
      }
      

      mysocket.cpp

      #include "mysocket.h"
      
      MySocket::MySocket(int socketDescriptor)
      {
      ID=socketDescriptor;
      }
      
      void MySocket::leerMsg()
      {
          qDebug()<<"Mensaje entrante";
          msgSend="";
         socket->waitForReadyRead(100);
          msgSend=socket->readAll();
      
          qDebug()<<msgSend.toHex();
          emit mensajeEnviarSocket(&msgSend);
      }
      
      void MySocket::funcionamiento()
      {
          socket= new QTcpSocket;
          estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
          connect(this, SIGNAL(disconnected()), this, SLOT(desconexion()));
          connect(this, SIGNAL(readyRead()), this, SLOT(leerMsg()));
          qDebug()<<"Hola";
      }
      
      void MySocket::desconexion()
      {
         socket->close();
         socket->deleteLater();
      }
      
      void MySocket::getMsg(QByteArray *array)
      {
      if(socket->waitForConnected(1000)){
          arr=*array;
          socket->write(arr);
          socket->flush();
          socket->waitForBytesWritten(3000);
      }
      }
      
      

      I know that the troble is that the signal ReadyRead() is not emitted when I receive a new package of data from the client. As I said, I know that the client send the messages propertly; so I think that the trouble is with the class MySocket that don't work propertly. I have been the last hourse trying to find a solution.

      K Offline
      K Offline
      koahnig
      wrote on last edited by
      #2

      @Dooham said in QTcpSocket doesn't emit the signal ReadyRead():

      void MySocket::funcionamiento()
      {
      socket= new QTcpSocket;
      estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
      connect(this, SIGNAL(disconnected()), this, SLOT(desconexion()));
      connect(this, SIGNAL(readyRead()), this, SLOT(leerMsg()));
      qDebug()<<"Hola";
      }

      Your problem seems to be there.

      The signal is not connected to its origin "socket", but the object hosting "socket". Probably you need to change to

       void MySocket::funcionamiento()
       {
           socket= new QTcpSocket;
           estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
           connect(socket, SIGNAL(disconnected()), this, SLOT(desconexion()));
           connect(socket, SIGNAL(readyRead()), this, SLOT(leerMsg()));
           qDebug()<<"Hola";
       }
      

      You should check also the application's output (e.g. in pane Application Output of creator). There should be a message popping up that the connect failed.

      Alternatively you can use the functor syntax for connect which is giving you an error message at building time.

       void MySocket::funcionamiento()
       {
           socket= new QTcpSocket;
           estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
           connect(socket, &QTcpSocket::disconnected, this, &MySocket::desconexion);
           connect(socket, &QTcpSocket::readyRead, this, &MySocket::leerMsg);
           qDebug()<<"Hola";
       }
      

      When you try the latter syntax with "this" instead of socket you will see immediately the effect e.g.

           connect(this, &QTcpSocket::disconnected, this, &MySocket::desconexion);
           connect(this, &QTcpSocket::readyRead, this, &MySocket::leerMsg);
      

      Vote the answer(s) that helped you to solve your issue(s)

      DoohamD 1 Reply Last reply
      4
      • K koahnig

        @Dooham said in QTcpSocket doesn't emit the signal ReadyRead():

        void MySocket::funcionamiento()
        {
        socket= new QTcpSocket;
        estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
        connect(this, SIGNAL(disconnected()), this, SLOT(desconexion()));
        connect(this, SIGNAL(readyRead()), this, SLOT(leerMsg()));
        qDebug()<<"Hola";
        }

        Your problem seems to be there.

        The signal is not connected to its origin "socket", but the object hosting "socket". Probably you need to change to

         void MySocket::funcionamiento()
         {
             socket= new QTcpSocket;
             estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
             connect(socket, SIGNAL(disconnected()), this, SLOT(desconexion()));
             connect(socket, SIGNAL(readyRead()), this, SLOT(leerMsg()));
             qDebug()<<"Hola";
         }
        

        You should check also the application's output (e.g. in pane Application Output of creator). There should be a message popping up that the connect failed.

        Alternatively you can use the functor syntax for connect which is giving you an error message at building time.

         void MySocket::funcionamiento()
         {
             socket= new QTcpSocket;
             estado=socket->setSocketDescriptor(ID, QAbstractSocket::ConnectedState, QIODevice::ReadWrite);
             connect(socket, &QTcpSocket::disconnected, this, &MySocket::desconexion);
             connect(socket, &QTcpSocket::readyRead, this, &MySocket::leerMsg);
             qDebug()<<"Hola";
         }
        

        When you try the latter syntax with "this" instead of socket you will see immediately the effect e.g.

             connect(this, &QTcpSocket::disconnected, this, &MySocket::desconexion);
             connect(this, &QTcpSocket::readyRead, this, &MySocket::leerMsg);
        
        DoohamD Offline
        DoohamD Offline
        Dooham
        wrote on last edited by
        #3

        @koahnig You were right, changing the pointer this to socket in the connection function of readyRead, it worked. Thanks you

        1 Reply Last reply
        1

        • Login

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