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. how to detect when a server is disconnected
QtWS25 Last Chance

how to detect when a server is disconnected

Scheduled Pinned Locked Moved Unsolved General and Desktop
20 Posts 5 Posters 5.2k Views
  • 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.
  • ManiRonM Offline
    ManiRonM Offline
    ManiRon
    wrote on last edited by ManiRon
    #1

    I have an client and server application in which i am able to transmit data and receive data and i can disconnect from server from client side but now my problem is.

    In my server application i have a button that stops the server . in client side i have done some thing like "connect(&sock, &QTcpSocket::disconnected,this,&MainWindow::targetConnectionStatus,Qt::UniqueConnection);" this is triggered when i close the whole server application by pressing the windows close button , but when i press the stop server button this (i mean in the client side "connect" ) is not triggered. Is there any mistake i am doing ?

    jsulmJ JonBJ 2 Replies Last reply
    0
    • ManiRonM ManiRon

      I have an client and server application in which i am able to transmit data and receive data and i can disconnect from server from client side but now my problem is.

      In my server application i have a button that stops the server . in client side i have done some thing like "connect(&sock, &QTcpSocket::disconnected,this,&MainWindow::targetConnectionStatus,Qt::UniqueConnection);" this is triggered when i close the whole server application by pressing the windows close button , but when i press the stop server button this (i mean in the client side "connect" ) is not triggered. Is there any mistake i am doing ?

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @ManiRon said in how to detect when a server is disconnected:

      In my server application i have a button that stops the server

      How does it "stop" the server? What exactly are you doing? Do you close the sockets on server side?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      ManiRonM 1 Reply Last reply
      2
      • ManiRonM ManiRon

        I have an client and server application in which i am able to transmit data and receive data and i can disconnect from server from client side but now my problem is.

        In my server application i have a button that stops the server . in client side i have done some thing like "connect(&sock, &QTcpSocket::disconnected,this,&MainWindow::targetConnectionStatus,Qt::UniqueConnection);" this is triggered when i close the whole server application by pressing the windows close button , but when i press the stop server button this (i mean in the client side "connect" ) is not triggered. Is there any mistake i am doing ?

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #3

        @ManiRon

        • What does "stops the server" mean if it's different from "close the whole server"?

        • If you find that "close the whole server" does work, you need to do whatever similar in your "stop" code, e.g. perhaps close or destroy the socket, I don't know what it is you are actually doing?

        • Frankly, I think you are lucky if client disconnect is even fired on, say, server closure. Might depend on whether client & server are on same machine, might depend on TCP stack, but it's common in TCP protocol that one side cannot recognise if the other side "goes away", that's the point of the protocol. Make sure server closes socket properly, I think then client sees that....

        ManiRonM 1 Reply Last reply
        1
        • jsulmJ jsulm

          @ManiRon said in how to detect when a server is disconnected:

          In my server application i have a button that stops the server

          How does it "stop" the server? What exactly are you doing? Do you close the sockets on server side?

          ManiRonM Offline
          ManiRonM Offline
          ManiRon
          wrote on last edited by
          #4

          @jsulm i mean when i press the stop server button , it actually closes the server.

          jsulmJ 1 Reply Last reply
          0
          • ManiRonM ManiRon

            @jsulm i mean when i press the stop server button , it actually closes the server.

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by
            #5

            @ManiRon Please explain what you mean by "closes the server". What is closed then? What is server in this context? From what you provided so far I really have NO idea what exactly you're doing...

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            ManiRonM 1 Reply Last reply
            2
            • JonBJ JonB

              @ManiRon

              • What does "stops the server" mean if it's different from "close the whole server"?

              • If you find that "close the whole server" does work, you need to do whatever similar in your "stop" code, e.g. perhaps close or destroy the socket, I don't know what it is you are actually doing?

              • Frankly, I think you are lucky if client disconnect is even fired on, say, server closure. Might depend on whether client & server are on same machine, might depend on TCP stack, but it's common in TCP protocol that one side cannot recognise if the other side "goes away", that's the point of the protocol. Make sure server closes socket properly, I think then client sees that....

              ManiRonM Offline
              ManiRonM Offline
              ManiRon
              wrote on last edited by
              #6

              @JonB said in how to detect when a server is disconnected:

              that

              actually when i press the stop server button which i have placed in that i will close the server. But what happens when we close the whole application . because when i close the whole application using the windows close button the the connect call is triggered

              JonBJ jsulmJ 2 Replies Last reply
              0
              • ManiRonM ManiRon

                @JonB said in how to detect when a server is disconnected:

                that

                actually when i press the stop server button which i have placed in that i will close the server. But what happens when we close the whole application . because when i close the whole application using the windows close button the the connect call is triggered

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #7

                @ManiRon

                i will close the server

                @jsulm & I are asking you precisely what you mean here. What code do you actually execute to "close" the server, you're not telling us?

                ManiRonM 1 Reply Last reply
                0
                • ManiRonM ManiRon

                  @JonB said in how to detect when a server is disconnected:

                  that

                  actually when i press the stop server button which i have placed in that i will close the server. But what happens when we close the whole application . because when i close the whole application using the windows close button the the connect call is triggered

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @ManiRon Sorry, but I'm out from this thread as you don't provide any useful information, I'm not going to guess...

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  ManiRonM 1 Reply Last reply
                  0
                  • jsulmJ jsulm

                    @ManiRon Please explain what you mean by "closes the server". What is closed then? What is server in this context? From what you provided so far I really have NO idea what exactly you're doing...

                    ManiRonM Offline
                    ManiRonM Offline
                    ManiRon
                    wrote on last edited by ManiRon
                    #9

                    @jsulm 0_1552564450904_Untitled.jpg

                    This is how my application looks like . when i click start server button

                    "connect(server->tcpServer, &QTcpServer::newConnection, server, &ServerStuff::newConnection);" this i have given

                    inside newconnection()

                    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();

                    connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
                    connect(clientSocket, &QTcpSocket::readyRead, this, &ServerStuff::readClient);
                    connect(clientSocket, &QTcpSocket::disconnected, this, &ServerStuff::gotDisconnection);
                    
                    clients << clientSocket;
                    

                    these are the lines

                    smilarly when i press stop server button
                    "if(server->tcpServer->isListening())
                    {
                    disconnect(server->tcpServer, &QTcpServer::newConnection, server, &ServerStuff::newConnection);

                        QList<QTcpSocket *> clients = server->getClients();
                        server->tcpServer->close();
                        ui->textEdit_log->append(tr("<b>Server stopped</b>, post is closed"));
                    }"
                    

                    this is what is the code

                    ServerStuff(QObject *pwgt);
                    QTcpServer *tcpServer;
                    QList<QTcpSocket *> getClients();

                    J.HilkJ 1 Reply Last reply
                    0
                    • jsulmJ jsulm

                      @ManiRon Sorry, but I'm out from this thread as you don't provide any useful information, I'm not going to guess...

                      ManiRonM Offline
                      ManiRonM Offline
                      ManiRon
                      wrote on last edited by
                      #10

                      @jsulm sir i have provided

                      jsulmJ 1 Reply Last reply
                      0
                      • ManiRonM ManiRon

                        @jsulm sir i have provided

                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        @ManiRon You don't disconnect the clients when stopping server

                        for (QTcpSocket *socket : sockets)
                            socket->deleteLater();
                        

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        1
                        • JonBJ JonB

                          @ManiRon

                          i will close the server

                          @jsulm & I are asking you precisely what you mean here. What code do you actually execute to "close" the server, you're not telling us?

                          ManiRonM Offline
                          ManiRonM Offline
                          ManiRon
                          wrote on last edited by
                          #12

                          @JonB @jsulm now my doubt is when i press the stop server button with the above mentioned code inside it doesnt trigger the connect in client but when i close the whole application by using the windows (x) button then it triggers the connect in client

                          jsulmJ 1 Reply Last reply
                          0
                          • ManiRonM ManiRon

                            @JonB @jsulm now my doubt is when i press the stop server button with the above mentioned code inside it doesnt trigger the connect in client but when i close the whole application by using the windows (x) button then it triggers the connect in client

                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            @ManiRon I guess you mean it triggers disconnect, not connect?
                            Did you try what I suggested?

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            ManiRonM 1 Reply Last reply
                            0
                            • jsulmJ jsulm

                              @ManiRon I guess you mean it triggers disconnect, not connect?
                              Did you try what I suggested?

                              ManiRonM Offline
                              ManiRonM Offline
                              ManiRon
                              wrote on last edited by
                              #14

                              @jsulm yes i tried but still the same , No actually i have made a connect in client side when ever the server side disconnects it will trigger my function in which i will print disconnected . this is triggered when i close the whole application but when i press that stop server button with what you have said it didnt work.

                              if(server->tcpServer->isListening())
                              {
                              disconnect(server->tcpServer, &QTcpServer::newConnection, server, &ServerStuff::newConnection);

                                  QList<QTcpSocket *> clients = server->getClients();
                                  for(int i = 0; i < clients.count(); i++)
                                  {
                                      //server->sendToClient(clients.at(i), "Connection closed");
                              

                              // server->sendToClient(clients.at(i), "0");
                              }

                                  //server->tcpServer->close();
                                  server->clientSocket->deleteLater();
                                  //server->tcpServer->close();
                                  ui->textEdit_log->append(tr("<b>Server stopped</b>, post is closed"));
                              }
                              
                              1 Reply Last reply
                              0
                              • Christian EhrlicherC Offline
                                Christian EhrlicherC Offline
                                Christian Ehrlicher
                                Lifetime Qt Champion
                                wrote on last edited by
                                #15

                                You should take a look at

                                • QAbstractSocket::disconnectFromHost()
                                • QAbstractSocket::waitForDisconnected()

                                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                Visit the Qt Academy at https://academy.qt.io/catalog

                                JonBJ 1 Reply Last reply
                                1
                                • Christian EhrlicherC Christian Ehrlicher

                                  You should take a look at

                                  • QAbstractSocket::disconnectFromHost()
                                  • QAbstractSocket::waitForDisconnected()
                                  JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by
                                  #16

                                  @Christian-Ehrlicher

                                  QAbstractSocket::disconnectFromHost()

                                  At last someone points to a useful function! So does this mean if closing at server side it is its job to iterate each client and issue that call? There is not an automatic "shut me down and I'll disconnect from each client for you"? Just trying to understand.

                                  1 Reply Last reply
                                  0
                                  • ManiRonM ManiRon

                                    @jsulm 0_1552564450904_Untitled.jpg

                                    This is how my application looks like . when i click start server button

                                    "connect(server->tcpServer, &QTcpServer::newConnection, server, &ServerStuff::newConnection);" this i have given

                                    inside newconnection()

                                    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();

                                    connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
                                    connect(clientSocket, &QTcpSocket::readyRead, this, &ServerStuff::readClient);
                                    connect(clientSocket, &QTcpSocket::disconnected, this, &ServerStuff::gotDisconnection);
                                    
                                    clients << clientSocket;
                                    

                                    these are the lines

                                    smilarly when i press stop server button
                                    "if(server->tcpServer->isListening())
                                    {
                                    disconnect(server->tcpServer, &QTcpServer::newConnection, server, &ServerStuff::newConnection);

                                        QList<QTcpSocket *> clients = server->getClients();
                                        server->tcpServer->close();
                                        ui->textEdit_log->append(tr("<b>Server stopped</b>, post is closed"));
                                    }"
                                    

                                    this is what is the code

                                    ServerStuff(QObject *pwgt);
                                    QTcpServer *tcpServer;
                                    QList<QTcpSocket *> getClients();

                                    J.HilkJ Offline
                                    J.HilkJ Offline
                                    J.Hilk
                                    Moderators
                                    wrote on last edited by J.Hilk
                                    #17

                                    @ManiRon
                                    if I get this, right, than pressing stop server, behaves as expected but closing the window and therefore closing/quitting your app does not follow the correct server shotdown procedure?

                                    In that case I would suggest overriding the close event something along this line:

                                    //My assumption is your Window class is named MainWindow, if not you'll have to adapt that
                                    
                                    //inside the header
                                    protected:
                                          virtual void closeEvent (QCloseEvent *event) override;
                                    
                                    //inside your cpp file
                                    
                                     #include <QCloseEvent>
                                    void MainWindow::closeEvent (QCloseEvent *event)
                                    {
                                        sameFunctionWhenStopServerClicked();
                                            
                                        event->accept();
                                    }
                                    

                                    Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                    Q: What's that?
                                    A: It's blue light.
                                    Q: What does it do?
                                    A: It turns blue.

                                    JonBJ 1 Reply Last reply
                                    0
                                    • J.HilkJ J.Hilk

                                      @ManiRon
                                      if I get this, right, than pressing stop server, behaves as expected but closing the window and therefore closing/quitting your app does not follow the correct server shotdown procedure?

                                      In that case I would suggest overriding the close event something along this line:

                                      //My assumption is your Window class is named MainWindow, if not you'll have to adapt that
                                      
                                      //inside the header
                                      protected:
                                            virtual void closeEvent (QCloseEvent *event) override;
                                      
                                      //inside your cpp file
                                      
                                       #include <QCloseEvent>
                                      void MainWindow::closeEvent (QCloseEvent *event)
                                      {
                                          sameFunctionWhenStopServerClicked();
                                              
                                          event->accept();
                                      }
                                      
                                      JonBJ Offline
                                      JonBJ Offline
                                      JonB
                                      wrote on last edited by JonB
                                      #18

                                      @J.Hilk
                                      I'm afraid you're the wrong way round! For OP closing app does correctly disconnect, his problem is that he does not know exactly what code to write to make it work correctly if he does not close but wants his own code (off a button press) to do the socket closure such that client sees it.... For which @Christian-Ehrlicher has told him he will need to call QAbstractSocket::disconnectFromHost(), and I am trying to verify with him this must be done explcitly on all connected client sockets.

                                      J.HilkJ 1 Reply Last reply
                                      1
                                      • JonBJ JonB

                                        @J.Hilk
                                        I'm afraid you're the wrong way round! For OP closing app does correctly disconnect, his problem is that he does not know exactly what code to write to make it work correctly if he does not close but wants his own code (off a button press) to do the socket closure such that client sees it.... For which @Christian-Ehrlicher has told him he will need to call QAbstractSocket::disconnectFromHost(), and I am trying to verify with him this must be done explcitly on all connected client sockets.

                                        J.HilkJ Offline
                                        J.HilkJ Offline
                                        J.Hilk
                                        Moderators
                                        wrote on last edited by
                                        #19

                                        @JonB well in that case my answer isn't of much help ;-)


                                        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                        Q: What's that?
                                        A: It's blue light.
                                        Q: What does it do?
                                        A: It turns blue.

                                        JonBJ 1 Reply Last reply
                                        0
                                        • J.HilkJ J.Hilk

                                          @JonB well in that case my answer isn't of much help ;-)

                                          JonBJ Offline
                                          JonBJ Offline
                                          JonB
                                          wrote on last edited by
                                          #20

                                          @J.Hilk Well, it was a nice answer to a different question :)

                                          1 Reply Last reply
                                          0

                                          • Login

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