Is there a way to check availability local server with timeout in Qt?
-
wrote on 16 Jul 2020, 18:18 last edited by TomNow99
Hello,
I have on my VirtualBox linux with samba server. I have connection only between server and pc with virtualBox ( server can't connect with internet ). Is there a way to check availability server and after 5 seconds say: "no"?
Something like:
checkAvailabilityServer("\\192.168.43.21", 5);
?
If no Qt, maybe Winapi c++?
-
wrote on 16 Jul 2020, 18:36 last edited by
curl to the rescue:
curl -m 5 smb://192.168.43.21/ShareName/CanaryFile.txt
If the SMB server is alive, curl l will return curl: (67) Login denied
If the SMB server is down, curl will return curl: (28) Connection timed out after 5000 milliseconds -
wrote on 16 Jul 2020, 18:37 last edited by TomNow99
@hskoglund Thank you. But I don't give one more important information: my host OS is Windows 10. Curl is linux command right?
-
wrote on 16 Jul 2020, 18:38 last edited by
Hello!
You can try to use
QTcpSocket
class. Check out theconnectToHost
method: (https://doc.qt.io/qt-5/qabstractsocket.html#connectToHost) . Also, feel free to check thewaitForConnected
method as well: https://doc.qt.io/qt-5/qabstractsocket.html#waitForConnectedExample:
bool checkServerConnection() { QTcpSocket connectionSocket; connectionSocket.connectToHost("192.168.43.21", 5); connectionSocket.waitForConnected(5000); // 5 seconnds if (connectionSocket.state() == QTcpSocket::UnconnectedState) { connectionSocket.close(); return false; } connectionSocket.close(); return true; }
Happy coding!
-
wrote on 16 Jul 2020, 18:39 last edited by
@Cobra91151 Thank you for answer. Tommorow I check it! :)
-
@hskoglund Thank you. But I don't give one more important information: my host OS is Windows 10. Curl is linux command right?
wrote on 16 Jul 2020, 18:46 last edited by@TomNow99 said in Is there a way to check availability local server with timeout in Qt?:
@hskoglund Thank you. But I don't give one more important information: my host OS is Windows 10. Curl is linux command right?
It is available for
Windows
OS as well. You can check out this link for more details: https://curl.haxx.se/download.html -
wrote on 17 Jul 2020, 07:13 last edited by
@Cobra91151 @mrjj That QTcpSocket is very good. But what if I have situation that I don't want wait?
So I want only do:
QTcpSocket connectionSocket; connectionSocket.connectToHost("192.168.43.21", port); qDebug()<<connectionSocket.state();
I can no wait and always get "connected" when server is up and "notConnected" when server is down? This is only server on my virtualBox.
-
@Cobra91151 @mrjj That QTcpSocket is very good. But what if I have situation that I don't want wait?
So I want only do:
QTcpSocket connectionSocket; connectionSocket.connectToHost("192.168.43.21", port); qDebug()<<connectionSocket.state();
I can no wait and always get "connected" when server is up and "notConnected" when server is down? This is only server on my virtualBox.
-
wrote on 17 Jul 2020, 07:18 last edited by TomNow99
@jsulm Thank you. But I have other problem: I want check when server is down and I can't connect. Something like:
QTcpSocket connectionSocket; connect(connectionSocket, SIGNAL(cannotConnect()), this, SLOT(cannotConnectSlot())); connectionSocket.connectToHost("192.168.43.21", port);
-
@jsulm Thank you. But I have other problem: I want check when server is down and I can't connect. Something like:
QTcpSocket connectionSocket; connect(connectionSocket, SIGNAL(cannotConnect()), this, SLOT(cannotConnectSlot())); connectionSocket.connectToHost("192.168.43.21", port);
@TomNow99 You could use a QTimer with a timeout and if you do not get connected() until timeout you can assume that you can't connect.
-
wrote on 17 Jul 2020, 07:27 last edited by TomNow99
@jsulm I think about that, but I have many Qtimers :D
EDIT:
I want something like:
Run my server. And in my application I want check connect to this server every 3 seconds. If I can't connect I want write qDebug()<<"noConnection" and end checking.
-
@jsulm I think about that, but I have many Qtimers :D
EDIT:
I want something like:
Run my server. And in my application I want check connect to this server every 3 seconds. If I can't connect I want write qDebug()<<"noConnection" and end checking.
@TomNow99 I don't see any other solution as even a working connection needs some time to be established, you can't simply do the qDebug just after calling connectToHost()
-
wrote on 17 Jul 2020, 07:37 last edited by TomNow99
@jsulm Hmmm. I tried add new Qthread and check connection in this Qthread, but I get error "Cannot create children for a parent that is in a different thread". My code:
myThreadClass::myThreadClass(QTcpSocket *connSocket): connectionSocket(connSocket) { } myThreadClass::~myThreadClass() { connectionSocket->close(); } void myThreadClass::run() { while(1) { connectionSocket->connectToHost("192.168.43.23", 139); connectionSocket->waitForConnected(3000); if(connectionSocket->state() == QTcpSocket::UnconnectedState) { connectionSocket->close(); emit noConnection(); } connectionSocket->close(); } }
In mainWindow i create myThread and started it. I add QTcpSocket pointer and get this error.
class myThreadClass: public QThread { Q_OBJECT public: myThreadClass(QTcpSocket *connSocket); ~myThreadClass(); void run(); private: QTcpSocket *connectionSocket; signals: void noConnection(); };
-
@jsulm Hmmm. I tried add new Qthread and check connection in this Qthread, but I get error "Cannot create children for a parent that is in a different thread". My code:
myThreadClass::myThreadClass(QTcpSocket *connSocket): connectionSocket(connSocket) { } myThreadClass::~myThreadClass() { connectionSocket->close(); } void myThreadClass::run() { while(1) { connectionSocket->connectToHost("192.168.43.23", 139); connectionSocket->waitForConnected(3000); if(connectionSocket->state() == QTcpSocket::UnconnectedState) { connectionSocket->close(); emit noConnection(); } connectionSocket->close(); } }
In mainWindow i create myThread and started it. I add QTcpSocket pointer and get this error.
class myThreadClass: public QThread { Q_OBJECT public: myThreadClass(QTcpSocket *connSocket); ~myThreadClass(); void run(); private: QTcpSocket *connectionSocket; signals: void noConnection(); };
This post is deleted! -
@jsulm Hmmm. I tried add new Qthread and check connection in this Qthread, but I get error "Cannot create children for a parent that is in a different thread". My code:
myThreadClass::myThreadClass(QTcpSocket *connSocket): connectionSocket(connSocket) { } myThreadClass::~myThreadClass() { connectionSocket->close(); } void myThreadClass::run() { while(1) { connectionSocket->connectToHost("192.168.43.23", 139); connectionSocket->waitForConnected(3000); if(connectionSocket->state() == QTcpSocket::UnconnectedState) { connectionSocket->close(); emit noConnection(); } connectionSocket->close(); } }
In mainWindow i create myThread and started it. I add QTcpSocket pointer and get this error.
class myThreadClass: public QThread { Q_OBJECT public: myThreadClass(QTcpSocket *connSocket); ~myThreadClass(); void run(); private: QTcpSocket *connectionSocket; signals: void noConnection(); };
@TomNow99 said in Is there a way to check availability local server with timeout in Qt?:
while(1)
You're blocking event loop...
And the socket must be allocated in the thread where you want to use it. -
@TomNow99 I'm still not sure why you want this complicated solution using a thread if you can have one using a timer...
-
wrote on 17 Jul 2020, 07:53 last edited by TomNow99
@jsulm Hmmm, but how? Something like:
in QTimerSlot ( check evert 3 sec ) I have:
connectionSocket->connectToHost("192.168.43.23", 139); timer2.start(1000); // maybe singleShot
and how to connect information from slotConnected and other QTimer?
slotConnected() { result = true; } slotTimer2() { if(result == false ) { } }
?
-
@jsulm Hmmm, but how? Something like:
in QTimerSlot ( check evert 3 sec ) I have:
connectionSocket->connectToHost("192.168.43.23", 139); timer2.start(1000); // maybe singleShot
and how to connect information from slotConnected and other QTimer?
slotConnected() { result = true; } slotTimer2() { if(result == false ) { } }
?
@TomNow99 Yes, like this
2/20