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 adata handler
library, and thedata handler
library utilizes anetwork manager
library, which is where my problem lies.More Info
Firstly, QT provides a basic example for interactions between a
QTcpServer
(Fortune Server)and aQTcpSocket
(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 clickconnect 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 theclient
writes to the socket but thereadyRead()
on the server socket does not fire, however in the example given it does.Note:
The sameport
andip address
is used in thisserver-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 ofQMainWindow
is passed viadata handler
class and creates an instance of mynetwork manager
class which inheritsQObject
and implements theQ_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!
-
Hi,
Did you check that you are not sending an empty QByteArray ?
-
Isn't this the same issue as here https://forum.qt.io/topic/75821/qabstractsocket-unknownsocketerror-provides-errorstring-of-unknownerror?