Solved QTcpServer, listen, is the bind internal?
-
I have two applications one is using QTcpServer, call it App A and other is a client and uses QTcpSocket, call it App B.
A listens to Any IP on port 8123. There is a signal called newConnection which I connect to a slot:
void clsSocketServer::sayHello() { clsSocketClient* pClient = new clsSocketClient(nextPendingConnection()); if ( pClient == nullptr ) { return; } QByteArray arybytMsg; QDataStream dsOut(&arybytMsg, QIODevice::WriteOnly); dsOut.setVersion(clsJSON::mscintQtVersion); QJsonObject objMsg; objMsg.insert(clsJSON::mscszModule, clsMainWnd::mscstrTitle); dsOut << QJsonDocument(objMsg).toJson(QJsonDocument::Compact); connect(pClient, &QAbstractSocket::disconnected ,pClient, &QObject::deleteLater); pClient->sendJSON(objMsg); }
Application B looks for a local IP address and connects to it on the same port:
void clsModHelper::onConnectToXMLMPAM() { if ( isOpen() == true ) { //Already connected do nothing! return; } //Get the I/P address QList<QHostAddress> lstAddresses = QNetworkInterface::allAddresses(); QString strIP; for( int i=0; i<lstAddresses.size(); i++ ) { if ( lstAddresses[i] != QHostAddress::LocalHost && lstAddresses[i].toIPv4Address() ) { strIP = lstAddresses[i].toString(); break; } } if ( strIP.isEmpty() == true ) { strIP = QHostAddress(QHostAddress::LocalHost).toString(); } //Connect to the Application qdbg() << "Connecting to: " << strIP << ":" << muint16XMLMPAMport; connectToHost(strIP, muint16XMLMPAMport); }
When a connection from B to A is established the signal 'connected' is emitted and I can see a message is logged by the slot in application B 'onConnected':
void clsModFileIO::onConnected() { qdbg() << "onConnected"; }
I'm confused as application A shows no sign of the new connection, but if I terminate application A, application B gets the 'disconnected' signal, I can see that because the slot in application B:
void clsModFileIO::onDisconnected() { //Close the exiting connection close(); //Re-open the connection connectToXMLMPAM(); }
I would have expected to see in Application A that the slot that is connected to the 'newConnection' signal gets called, but it does not. I'm confused about what is going on and how I can progress this?
Application A signal connections:
connect(this, &QTcpServer::newConnection, this, &clsSocketServer::sayHello);
Application B signal connections:
QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit ,this, &clsModHelper::onExitModule); QObject::connect(this, SIGNAL(connected()), this, SLOT(onConnected())); QObject::connect(this, SIGNAL(connected()), this, SLOT(onSendModuleStartupMsg())); QObject::connect(this, SIGNAL(connected()), this, SLOT(onStartHeartbeat())); QObject::connect(this, SIGNAL(disconnected()), this, SLOT(onDisconnected())); QObject::connect(this, &QAbstractSocket::errorOccurred, this, &clsModHelper::onErrorOccurred); QObject::connect(this, &QIODevice::readyRead, this, &clsModHelper::onDataIn); QObject::connect(this, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64))); QObject::connect(this, &clsModHelper::terminateModule, this, &clsModHelper::onExitModule);
Application A , log:
D00000000000000000001:XMLMPAM is listening on: 192.168.1.158:8123 D00000000000000000002:L00000141Fsimon.js[void clsScriptHelper::log]: D00000000000000000003:************** setup **************** D00000000000000000004:L00000116Fsimon.js[void clsScriptHelper::log]: D00000000000000000005:************** connect **************** D00000000000000000006:L00000062Fsimon.js[void clsScriptHelper::log]: D00000000000000000007:L00000047Fsimon.js[QProcess *clsScriptHelper::pLaunch]: D00000000000000000008:Checking for PID for: /Users/simonplatten/XMLMPAM/config/modules/mdFileIO D00000000000000000009:Process: /Users/simonplatten/XMLMPAM/config/modules/mdFileIO started, PID: 80462 D00000000000000000010:L00000100Fsimon.js[void clsScriptHelper::log]: D00000000000000000011:************** setupFIO ****************
Application B, log:
D00000000000000000001:mdFileIO Version: 1.00 D00000000000000000002:Connecting to: 192.168.1.158:8123 D00000000000000000003:onConnected D00000000000000000004:sendJSON: 54 D00000000000000000005:clsModHelper::onBytesWritten:54 D00000000000000000006:sendJSON: 54 D00000000000000000007:clsModHelper::onBytesWritten:54 D00000000000000000008:sendJSON: 54 D00000000000000000009:clsModHelper::onBytesWritten:54 D00000000000000000010:sendJSON: 54 D00000000000000000011:clsModHelper::onBytesWritten:54 D00000000000000000012:sendJSON: 54 D00000000000000000013:clsModHelper::onBytesWritten:54 D00000000000000000014:sendJSON: 54 D00000000000000000015:clsModHelper::onBytesWritten:54
-
void clsSocketServer::sayHello() { clsSocketClient* pClient = new clsSocketClient(nextPendingConnection()); if ( pClient == nullptr ) { return; }
Can you please put in a
qDebug()
as the very first line of this slot. I don't know how the rest of your code behaves, you imply here it might fail.... -
This post is deleted! -
@SPlatten said in QTcpServer, listen, is the bind internal?:
There is a signal called newConnection which I connect to a slot
I'm confused as application A shows no sign of the new connection,
I would have expected to see in Application A that the slot that is connected to the 'newConnection' signal gets called, but it does not.
Among all theconnect
s you show, I see nothing aboutnewConnection
, norsayHello()
.Sigh. Did you edit it or did I just miss it?!
connect(this, &QTcpServer::newConnection, this, &clsSocketServer::sayHello);
Are you saying the slot does not get called?
-
Sorry, the newConnection signal connection is in the constructor:
clsSocketServer::clsSocketServer(QObject* pParent) : QTcpServer(pParent) { QString strListenFailure = QString("Cannot listen to port: ") + QString::number(clsSocketServer::mscuint16port); listen(QHostAddress::Any, clsSocketServer::mscuint16port); QList<QHostAddress> lstAddresses = QNetworkInterface::allAddresses(); QString strIP; for( int i=0; i<lstAddresses.size(); i++ ) { if ( lstAddresses[i] != QHostAddress::LocalHost && lstAddresses[i].toIPv4Address() ) { strIP = lstAddresses[i].toString(); break; } } if ( strIP.isEmpty() == true ) { strIP = QHostAddress(QHostAddress::LocalHost).toString(); } qdbg() << tr("XMLMPAM is listening on: %1:%2\n") .arg(strIP).arg(clsSocketServer::mscuint16port); QObject::connect(this, &QTcpServer::newConnection, this, &clsSocketServer::sayHello); Q_ASSERT_X(isListening(), "clsSocketServer::clsSocketServer", strListenFailure.toLatin1().data()); }
No it doesn't look like it is being called, however its clear that a connection is made because when I terminate Application A, application B gets disconnect signals.
-
void clsSocketServer::sayHello() { clsSocketClient* pClient = new clsSocketClient(nextPendingConnection()); if ( pClient == nullptr ) { return; }
Can you please put in a
qDebug()
as the very first line of this slot. I don't know how the rest of your code behaves, you imply here it might fail.... -
@JonB , Sorry, the 'newConnection' signal is being raised and the slot 'sayHello' does get called, I've just tested it again....I am not receiving the data that application B says it has transmitted and the 'bytesWritten' signal backs this up.
-
@SPlatten
That's a totally different question!You would want to supply a completely different set of code to address this.
-
@JonB , will do.