writing to QTcpSocket does not always emit readyRead signal on opposite QTcpSocket



  • I have been stuck on this for the past 5 days, I have no idea how to proceed.

    Overview:

    I have a client UI which interacts with a data handler library, and the data handler library utilizes a network manager library, which is where my problem lies.

    More Info

    Firstly, QT provides a basic example for interactions between a QTcpServer (Fortune Server)and a QTcpSocket (Fortune Client).

    I thus implemented this code into an extremely basic example of my own, which works like a charm and has no issues.

    My own adaption of fortune client and server for the record (basic)

    Quick Explaination:

    Server application runs, click on start server, then on the client side, enter text in field and click connect to server and text is displayed, easy!

    Problem:

    Implementing the code above into my network manager library, does not fire the QTcpSocket::readyRead() in the server application above.

    It connects to the server, where the QTcpServer::newConnection() is fired, as expected, straight after which the client writes to the socket but the readyRead() on the server socket does not fire, however in the example given it does.

    Note:
    The same port and ip address is used in this server-client application example and my current application, and the server is also running.

    Further Information:

    From the above code, I copied over directly from the client. Only 2 things were changed/modified:

    • String that is sent to server
    • return types for method

    This was copied into my network mannager ::write() method. When running my application, and instance of QMainWindow is passed via data handler class and creates an instance of my network manager class which inherits QObject and implements the Q_OBJECT macro.

    Code Examples:

    //client_UI Class (snippet):

    data_mananger *dman = new data_mananger(this);                //this -> QMainWindow
    ReturnObject r = dman->NET_AuthenticateUser_GetToken(Query);
    

    //data_manager library (snippet)

    data_mananger::data_mananger(QObject *_parent) :
        parent(_parent)
    {}
    
    ReturnObject data_mananger::NET_AuthenticateUser_GetToken(QString Query){
        //Query like "AUTH;U=xyz@a;P=1234"
    
        //convert query string to char
            QByteArray ba = Query.toLatin1();
    
        //send query and get QList return
            ReturnCode rCode = networkManager.write(ba);
    
        //...
    }
    

    //netman library (snippet)

    //.h
    
    class NETMANSHARED_EXPORT netman : public QObject
    {
        Q_OBJECT
    public
        netman();
        netman(QObject *_parent);
        //...
    
    private:
        QTcpSocket *tcp_con;
        //...
    };
    

    //cpp

    netman::netman(QObject *_parent) :
        parent(_parent)
    {
        tcp_con = new QTcpSocket(parent);
    }
    
            return;
        }
        serverIP.setAddress(serverInfo.addresses().first().toIPv4Address());
    }
    
    ReturnCode netman::write(QByteArray message, int portNumber){
    
        tcp_con->connectToHost(QHostAddress("127.0.0.1"), 5000);
    
        if (!tcp_con->waitForConnected())
        {
            qDebug(log_lib_netman_err) << "Unable to connect to server";
            return ReturnCode::FailedConnecting;
        }
    
        if (!tcp_con->isValid()) {
            qDebug(log_lib_netman_err) << "tcp socket invalid";
            return ReturnCode::SocketError;
        }
    
        if (!tcp_con->isOpen()) {
            qDebug(log_lib_netman_err) << "tcp socket not open";
            return ReturnCode::SocketError;
        }
    
        //    QByteArray block(message);
        QByteArray block;
        QDataStream out(&block,QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_0);
    
        out << QString("Hello world");
    
        if (!tcp_con->write(block)){
            qDebug(log_lib_netman_err) << "Unable to send data to server";
            return ReturnCode::WriteFailed;
        }
        else{
            qDebug(log_lib_netman_info) << "Data block sent";
            return ReturnCode::SentSuccess;
        }
    }
    

    Conclusion:

    The core code of the client side has been fully implemented, yet I cannot see why this error occurs.

    I would very much appreciate help/advice!


  • Lifetime Qt Champion

    Hi,

    Did you check that you are not sending an empty QByteArray ?


  • Qt Champions 2016



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