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. unable to send data via QTcpSocket
Forum Updated to NodeBB v4.3 + New Features

unable to send data via QTcpSocket

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 6 Posters 669 Views 1 Watching
  • 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #4

    Hi,

    As already suggested, you should use the errorOccured signal.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    L 1 Reply Last reply
    0
    • SGaistS SGaist

      Hi,

      As already suggested, you should use the errorOccured signal.

      L Offline
      L Offline
      Lightshadown
      wrote on last edited by
      #5

      @SGaist ok i just read all the documentation for my version of Qt 5.11, and im using TCP_socket->errorString() the reason why, is beacuse im not having the error signal been trigger, but if i use the errorstring function i get and Unknown error, the port is open, the port is writable and yet im unable to trigger any signal or write anything, in fact my program crash everytime, i even had to do a static_cast on the error handling so it can compile, i add my actual code below

      Server::Server(){
          Gen gen;
          TCP_socket = new QTcpSocket();
          QMessageBox MBox;
          QPushButton *boton_OK = MBox.addButton("Ok", QMessageBox::AcceptRole);
          MBox.setDefaultButton(boton_OK);
          
          //data.setDevice(TCP_socket);
          //data.setVersion(QDataStream::Qt_DefaultCompiledVersion);
          
          
          QObject::connect(TCP_socket, &QTcpSocket::connected, [&](){     // escrituta cuando se conecta
              MBox.setWindowTitle("Servidor");
              MBox.setText("Conectado");
                   gen.Log("tcp conectado");
              bool yes;
              
              QByteArray block("Hola motherfucker, from laptop");
              //QString dataSend;
      //        QDataStream data(&block, QIODevice::ReadWrite);
      //        //data << (quint16)0;
      //        dataSend.append("Enviando desde laptop");
      //        data << dataSend;
              //data.device()->seek(0);
              //data <<(quint16)(block.size()) - sizeof(quint16);
                    gen.Log("antes de escribir");
              //TCP_socket->write(block.size());
              TCP_socket->write(block);
                    gen.Log("despues de escribir");
              yes = TCP_socket->waitForBytesWritten();
                    gen.Log("despues de esperar");
              if (yes == true){ MBox.exec();} else {MBox.setText("Hay pedo"); MBox.exec();}
              TCP_socket->disconnectFromHost();
                   gen.Log("coneecion terminada");
          } ); 
                                                                
          QObject::connect(TCP_socket, &QTcpSocket::readyRead, [&](){    // lectura de datos
              gen.Log("dentro de readyRead");
              QString dataread;
              QByteArray data;
              
              MBox.setWindowTitle("Data Read");
              data = TCP_socket->readAll();
              dataread.append(data);
              MBox.setText("leido: " + dataread);
              gen.Log(dataread);
              MBox.exec();
          });
          
          // manejo de erores
          //QObject::connect(TCP_socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [&](QAbstractSocket::SocketError error) {
          QObject::connect(TCP_socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), [&](QAbstractSocket::SocketError error){   
              gen.Log("Error");
              MBox.setWindowTitle("Error ");
              //error = TCP_socket->error();
              switch(error){
                  case QAbstractSocket::RemoteHostClosedError:
                      MBox.setText("El servidor Cerro la coneccion, Error 500");
                      MBox.exec();
                      break;
                  case QAbstractSocket::HostNotFoundError:
                      MBox.setText("No se encontro el Servidor, Error 404");
                      MBox.exec();
                      break;
                  case QAbstractSocket::ConnectionRefusedError:
                      MBox.setText("La coneccion fue rechazada por el Servidor, Error 403");
                      MBox.exec();
                      break;
                  default:
                      MBox.setText("Hubo un error inesperado: " + TCP_socket->errorString());
                      MBox.exec();
              }
          });
          
          QObject::connect(TCP_socket, &QTcpSocket::disconnected, [&](){
              gen.Log("Desconectado del servidor");
              TCP_socket->deleteLater();
          });
      }
      
      Server::~Server(){
          
      }
      
      void Server::TCP_Request(){   // this one is been called from another class and triggers everything
          Gen L;
          QString Ip("192.168.1.70");
          L.Log("antes de coneccion");
          TCP_socket->connectToHost( Ip, 8000 );   // do a broadcast and search for servers ip
          //TCP_socket->waitForConnected(5000);
          
          
          if (TCP_socket->isOpen()){ L.Log("esta abierto el puerto"); }
          else { L.Log("no esta abierto el puerto"); }
          
          if(TCP_socket->isWritable()){ L.Log("Se puede escribir"); }
          else { L.Log("No se puede usar el puerto"); }
          
          L.Log("Error en el socket: " + TCP_socket->errorString());
          
      //    switch (TCP_socket->state()){
      //        case QAbstractSocket::UnconnectedState:
      //            L.Log("sin coneccion");
      //        case QAbstractSocket::ConnectingState:
      //            L.Log("Conecctando...");
      //        case QAbstractSocket::ConnectedState:
      //            L.Log("Coneccion exitosa");
      //    }
      }
      
      jsulmJ SGaistS 2 Replies Last reply
      0
      • L Lightshadown

        @SGaist ok i just read all the documentation for my version of Qt 5.11, and im using TCP_socket->errorString() the reason why, is beacuse im not having the error signal been trigger, but if i use the errorstring function i get and Unknown error, the port is open, the port is writable and yet im unable to trigger any signal or write anything, in fact my program crash everytime, i even had to do a static_cast on the error handling so it can compile, i add my actual code below

        Server::Server(){
            Gen gen;
            TCP_socket = new QTcpSocket();
            QMessageBox MBox;
            QPushButton *boton_OK = MBox.addButton("Ok", QMessageBox::AcceptRole);
            MBox.setDefaultButton(boton_OK);
            
            //data.setDevice(TCP_socket);
            //data.setVersion(QDataStream::Qt_DefaultCompiledVersion);
            
            
            QObject::connect(TCP_socket, &QTcpSocket::connected, [&](){     // escrituta cuando se conecta
                MBox.setWindowTitle("Servidor");
                MBox.setText("Conectado");
                     gen.Log("tcp conectado");
                bool yes;
                
                QByteArray block("Hola motherfucker, from laptop");
                //QString dataSend;
        //        QDataStream data(&block, QIODevice::ReadWrite);
        //        //data << (quint16)0;
        //        dataSend.append("Enviando desde laptop");
        //        data << dataSend;
                //data.device()->seek(0);
                //data <<(quint16)(block.size()) - sizeof(quint16);
                      gen.Log("antes de escribir");
                //TCP_socket->write(block.size());
                TCP_socket->write(block);
                      gen.Log("despues de escribir");
                yes = TCP_socket->waitForBytesWritten();
                      gen.Log("despues de esperar");
                if (yes == true){ MBox.exec();} else {MBox.setText("Hay pedo"); MBox.exec();}
                TCP_socket->disconnectFromHost();
                     gen.Log("coneecion terminada");
            } ); 
                                                                  
            QObject::connect(TCP_socket, &QTcpSocket::readyRead, [&](){    // lectura de datos
                gen.Log("dentro de readyRead");
                QString dataread;
                QByteArray data;
                
                MBox.setWindowTitle("Data Read");
                data = TCP_socket->readAll();
                dataread.append(data);
                MBox.setText("leido: " + dataread);
                gen.Log(dataread);
                MBox.exec();
            });
            
            // manejo de erores
            //QObject::connect(TCP_socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [&](QAbstractSocket::SocketError error) {
            QObject::connect(TCP_socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), [&](QAbstractSocket::SocketError error){   
                gen.Log("Error");
                MBox.setWindowTitle("Error ");
                //error = TCP_socket->error();
                switch(error){
                    case QAbstractSocket::RemoteHostClosedError:
                        MBox.setText("El servidor Cerro la coneccion, Error 500");
                        MBox.exec();
                        break;
                    case QAbstractSocket::HostNotFoundError:
                        MBox.setText("No se encontro el Servidor, Error 404");
                        MBox.exec();
                        break;
                    case QAbstractSocket::ConnectionRefusedError:
                        MBox.setText("La coneccion fue rechazada por el Servidor, Error 403");
                        MBox.exec();
                        break;
                    default:
                        MBox.setText("Hubo un error inesperado: " + TCP_socket->errorString());
                        MBox.exec();
                }
            });
            
            QObject::connect(TCP_socket, &QTcpSocket::disconnected, [&](){
                gen.Log("Desconectado del servidor");
                TCP_socket->deleteLater();
            });
        }
        
        Server::~Server(){
            
        }
        
        void Server::TCP_Request(){   // this one is been called from another class and triggers everything
            Gen L;
            QString Ip("192.168.1.70");
            L.Log("antes de coneccion");
            TCP_socket->connectToHost( Ip, 8000 );   // do a broadcast and search for servers ip
            //TCP_socket->waitForConnected(5000);
            
            
            if (TCP_socket->isOpen()){ L.Log("esta abierto el puerto"); }
            else { L.Log("no esta abierto el puerto"); }
            
            if(TCP_socket->isWritable()){ L.Log("Se puede escribir"); }
            else { L.Log("No se puede usar el puerto"); }
            
            L.Log("Error en el socket: " + TCP_socket->errorString());
            
        //    switch (TCP_socket->state()){
        //        case QAbstractSocket::UnconnectedState:
        //            L.Log("sin coneccion");
        //        case QAbstractSocket::ConnectingState:
        //            L.Log("Conecctando...");
        //        case QAbstractSocket::ConnectedState:
        //            L.Log("Coneccion exitosa");
        //    }
        }
        
        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #6

        @Lightshadown said in unable to send data via QTcpSocket:

        TCP_socket->write(block);

        Up to here you did NOT connect error() signal!
        Please connect this signal BEFORE you try to send any data.

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

        L 1 Reply Last reply
        1
        • L Lightshadown

          @JonB ok you are right, i was calling the wrong instance heres my actual code that works when im connecting to the server, i use QTcpSocket::connected yet im unable to send any data to the server, my problem comes when im using TCP_socket->write(block) it supose im sending the data in here, but my program freeze everytime it reachs this point.

          QObject::connect(TCP_socket, &QTcpSocket::connected, [&](){
                  QMessageBox MBox;
                  QPushButton *boton_OK = MBox.addButton("Ok", QMessageBox::AcceptRole);
                  MBox.setWindowTitle("Servidor");
                  MBox.setDefaultButton(boton_OK);
                  MBox.setText("Conectado");
                       gen.Log("tcp conectado");
                  bool yes;
                  
                  QByteArray block;
                  QString dataSend;
                  QDataStream data(&block, QIODevice::ReadWrite);
                  //data << (quint16)0;
                  dataSend.append("Sending data");
                  data << dataSend;
                  //data.device()->seek(0);
                  //data <<(quint16)(block.size()) - sizeof(quint16);
                        gen.Log("antes de escribir");
                  //TCP_socket->write(block.size());
                  TCP_socket->write(block);
                        gen.Log("despues de escribir");
                  yes = TCP_socket->waitForBytesWritten();
                        gen.Log("despues de esperar");
                  if (yes == true){ MBox.exec();} else {MBox.setText("Hay pedo"); MBox.exec();}
                  TCP_socket->disconnectFromHost();
                       gen.Log("coneecion terminada");
              } ); 
          

          Also i try to use the error handling but i allways get the follow error while using connect and wont compile, no matching function for call to 'QObject::connect(QTcpSocket/&, <unresolved overloaded function type>, Server::Server()::<lambda()>) i have to use lambdas because the normal slot methods also give me errors

          QObject::connect(TCP_socket, &QTcpSocket::error, [&](){
                  QTcpSocket::SocketError error;
                  QMessageBox MBox;
                  QPushButton *boton_OK = MBox.addButton("Ok", QMessageBox::AcceptRole);
                  MBox.setWindowTitle("Error ");
                  MBox.setDefaultButton(boton_OK);
          
                  error = TCP_socket->error();
                  switch(error){
                      case QAbstractSocket::RemoteHostClosedError:
                          MBox.setText("El servidor Cerro la coneccion, Error 500");
                          MBox.exec();
                          break;
                      case QAbstractSocket::HostNotFoundError:
                          MBox.setText("No se encontro el Servidor, Error 404");
                          MBox.exec();
                          break;
                      case QAbstractSocket::ConnectionRefusedError:
                          MBox.setText("La coneccion fue rechazada por el Servidor, Error 403");
                          MBox.exec();
                          break;
                      default:
                          MBox.setText("Hubo un error inesperado: " + TCP_socket->errorString());
                          MBox.exec();
                  }
              });
          

          if i try to use the normal slots system for the tcp socket i got, template argument deduction/substitution failed

           QObject::connect(TCP_socket, &QTcpSocket::error, this, &Server::displayError);
          
          J.HilkJ Online
          J.HilkJ Online
          J.Hilk
          Moderators
          wrote on last edited by
          #7

          @Lightshadown said in unable to send data via QTcpSocket:

          yes = TCP_socket->waitForBytesWritten();

          also do not use blocking calls when you're already using signals. QTcpSocket has the bytesWritten signal for this.

          Also,also, please remove the QMessageBox from the lambda body.

          Currently you're mixing synchronous and asynchronous apis and sprinkle some additional event loops in. Those 3 should never meet.


          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.

          1 Reply Last reply
          1
          • jsulmJ jsulm

            @Lightshadown said in unable to send data via QTcpSocket:

            TCP_socket->write(block);

            Up to here you did NOT connect error() signal!
            Please connect this signal BEFORE you try to send any data.

            L Offline
            L Offline
            Lightshadown
            wrote on last edited by Lightshadown
            #8

            @jsulm the error handler is already connected but forgot to uncomment on the one i posted my bad, this is the one i used error = TCP_socket->error(); , still i can access the lambda but the switch statement fails for some reason, i did updated the switch and added all the errors that comes from the enum and it still fails, i have a problem with the error handler and already tried to use my Log function that accept QString, but it crash onces i use the error variable

            @J-Hilk ok sorry on that one didnt pay attention, i already erased all the QMessageBox, so its working properly until i reach TCP_socket->write i suspect its my server, its writen in python, it works but only for the first string i did check using another client writen in python

            edit: i simply added TPC_socket->flush() and it kinda works, it behaves like the data is already send and even disconect from the server at the end but the data its not recieved on my server

            Server.py

            
            import asyncio
            import websockets
            import socket
            import sqlite3 
            
            
            def get_ip():    # returns primary private IP only
                s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                try:
                    # doesn't even have to be reachable
                    s.connect(('10.255.255.255', 1))
                    IP = s.getsockname()[0]
                except Exception:
                    IP = '127.0.0.1'
                finally:
                    s.close()
                return IP
            
            
            async def handle_connectio(websocket, path):  # recive and handle connection from client, would handle json or file data
                try:
                    async for name in websocket:
                        #name = await websocket.recv()
                        print(f"<<< {name}")
                except websocket.exceptions.ConnectionClosed as e:
                    print (f"Coneecion terminada")
            
            
            print ("Iniciando el Server webSocket")
            print ("Current Ip: " + get_ip())
            servidor = websockets.serve(handle_connectio, get_ip(), 8000)
            
            asyncio.get_event_loop().run_until_complete(servidor)
            asyncio.get_event_loop().run_forever()
                    
            #async def main():  # main function
            #    print ("Iniciando Server websocket")
            #    print("Current Ip: " + get_ip())
            #    async with websockets.serve(handle_connectio, get_ip(), 8000):
            #        await asyncio.Future()
            
            
            #if __name__ == '__main__':
            #    asyncio.run(main())
            
            
            1 Reply Last reply
            0
            • L Lightshadown

              @SGaist ok i just read all the documentation for my version of Qt 5.11, and im using TCP_socket->errorString() the reason why, is beacuse im not having the error signal been trigger, but if i use the errorstring function i get and Unknown error, the port is open, the port is writable and yet im unable to trigger any signal or write anything, in fact my program crash everytime, i even had to do a static_cast on the error handling so it can compile, i add my actual code below

              Server::Server(){
                  Gen gen;
                  TCP_socket = new QTcpSocket();
                  QMessageBox MBox;
                  QPushButton *boton_OK = MBox.addButton("Ok", QMessageBox::AcceptRole);
                  MBox.setDefaultButton(boton_OK);
                  
                  //data.setDevice(TCP_socket);
                  //data.setVersion(QDataStream::Qt_DefaultCompiledVersion);
                  
                  
                  QObject::connect(TCP_socket, &QTcpSocket::connected, [&](){     // escrituta cuando se conecta
                      MBox.setWindowTitle("Servidor");
                      MBox.setText("Conectado");
                           gen.Log("tcp conectado");
                      bool yes;
                      
                      QByteArray block("Hola motherfucker, from laptop");
                      //QString dataSend;
              //        QDataStream data(&block, QIODevice::ReadWrite);
              //        //data << (quint16)0;
              //        dataSend.append("Enviando desde laptop");
              //        data << dataSend;
                      //data.device()->seek(0);
                      //data <<(quint16)(block.size()) - sizeof(quint16);
                            gen.Log("antes de escribir");
                      //TCP_socket->write(block.size());
                      TCP_socket->write(block);
                            gen.Log("despues de escribir");
                      yes = TCP_socket->waitForBytesWritten();
                            gen.Log("despues de esperar");
                      if (yes == true){ MBox.exec();} else {MBox.setText("Hay pedo"); MBox.exec();}
                      TCP_socket->disconnectFromHost();
                           gen.Log("coneecion terminada");
                  } ); 
                                                                        
                  QObject::connect(TCP_socket, &QTcpSocket::readyRead, [&](){    // lectura de datos
                      gen.Log("dentro de readyRead");
                      QString dataread;
                      QByteArray data;
                      
                      MBox.setWindowTitle("Data Read");
                      data = TCP_socket->readAll();
                      dataread.append(data);
                      MBox.setText("leido: " + dataread);
                      gen.Log(dataread);
                      MBox.exec();
                  });
                  
                  // manejo de erores
                  //QObject::connect(TCP_socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [&](QAbstractSocket::SocketError error) {
                  QObject::connect(TCP_socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), [&](QAbstractSocket::SocketError error){   
                      gen.Log("Error");
                      MBox.setWindowTitle("Error ");
                      //error = TCP_socket->error();
                      switch(error){
                          case QAbstractSocket::RemoteHostClosedError:
                              MBox.setText("El servidor Cerro la coneccion, Error 500");
                              MBox.exec();
                              break;
                          case QAbstractSocket::HostNotFoundError:
                              MBox.setText("No se encontro el Servidor, Error 404");
                              MBox.exec();
                              break;
                          case QAbstractSocket::ConnectionRefusedError:
                              MBox.setText("La coneccion fue rechazada por el Servidor, Error 403");
                              MBox.exec();
                              break;
                          default:
                              MBox.setText("Hubo un error inesperado: " + TCP_socket->errorString());
                              MBox.exec();
                      }
                  });
                  
                  QObject::connect(TCP_socket, &QTcpSocket::disconnected, [&](){
                      gen.Log("Desconectado del servidor");
                      TCP_socket->deleteLater();
                  });
              }
              
              Server::~Server(){
                  
              }
              
              void Server::TCP_Request(){   // this one is been called from another class and triggers everything
                  Gen L;
                  QString Ip("192.168.1.70");
                  L.Log("antes de coneccion");
                  TCP_socket->connectToHost( Ip, 8000 );   // do a broadcast and search for servers ip
                  //TCP_socket->waitForConnected(5000);
                  
                  
                  if (TCP_socket->isOpen()){ L.Log("esta abierto el puerto"); }
                  else { L.Log("no esta abierto el puerto"); }
                  
                  if(TCP_socket->isWritable()){ L.Log("Se puede escribir"); }
                  else { L.Log("No se puede usar el puerto"); }
                  
                  L.Log("Error en el socket: " + TCP_socket->errorString());
                  
              //    switch (TCP_socket->state()){
              //        case QAbstractSocket::UnconnectedState:
              //            L.Log("sin coneccion");
              //        case QAbstractSocket::ConnectingState:
              //            L.Log("Conecctando...");
              //        case QAbstractSocket::ConnectedState:
              //            L.Log("Coneccion exitosa");
              //    }
              }
              
              SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by SGaist
              #9

              @Lightshadown said in unable to send data via QTcpSocket:

              TCP_socket = new QTcpSocket();

              You are shadowing your class member variable of the same name and likely have a warning about that when you compile.

              @Lightshadown said in unable to send data via QTcpSocket:

              void Server::TCP_Request(){ // this one is been called from another class and triggers everything
              Gen L;
              QString Ip("192.168.1.70");
              L.Log("antes de coneccion");
              TCP_socket->connectToHost( Ip, 8000 ); // do a broadcast and search for servers ip
              //TCP_socket->waitForConnected(5000);

              Using an uninitialized variable and thus crash.

              [edit: must have been too tired, I thought I saw the variable declared within the constructor... SGaist]

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              L 1 Reply Last reply
              2
              • SGaistS SGaist

                @Lightshadown said in unable to send data via QTcpSocket:

                TCP_socket = new QTcpSocket();

                You are shadowing your class member variable of the same name and likely have a warning about that when you compile.

                @Lightshadown said in unable to send data via QTcpSocket:

                void Server::TCP_Request(){ // this one is been called from another class and triggers everything
                Gen L;
                QString Ip("192.168.1.70");
                L.Log("antes de coneccion");
                TCP_socket->connectToHost( Ip, 8000 ); // do a broadcast and search for servers ip
                //TCP_socket->waitForConnected(5000);

                Using an uninitialized variable and thus crash.

                [edit: must have been too tired, I thought I saw the variable declared within the constructor... SGaist]

                L Offline
                L Offline
                Lightshadown
                wrote on last edited by
                #10

                @SGaist that socket was declared as private on the class declaration

                class Server {
                   public:
                        Server();
                        virtual ~Server();
                        void TCP_Request();
                    public slots:
                    private: 
                         QTcpSocket *TCP_socket = nullptr;
                   };
                KroMignonK 1 Reply Last reply
                0
                • L Lightshadown

                  @SGaist that socket was declared as private on the class declaration

                  class Server {
                     public:
                          Server();
                          virtual ~Server();
                          void TCP_Request();
                      public slots:
                      private: 
                           QTcpSocket *TCP_socket = nullptr;
                     };
                  KroMignonK Offline
                  KroMignonK Offline
                  KroMignon
                  wrote on last edited by
                  #11

                  @Lightshadown said in unable to send data via QTcpSocket:

                  class Server {
                  public:
                  Server();
                  virtual ~Server();
                  void TCP_Request();
                  public slots:
                  private:
                  QTcpSocket *TCP_socket = nullptr;
                  };

                  If you want to declare slots (or signals) in your class, you have to:

                  • subclass QObject (or a QObject based class)
                  • add Q_OBJECT declaration

                  so you class should be:

                  class Server : public QObject {
                     Q_OBJECT
                     public:
                          explicit Server(QObject * parent=nullptr);
                          virtual ~Server();
                          void TCP_Request();
                      public slots:
                      private: 
                           QTcpSocket *TCP_socket = nullptr;
                     };
                  

                  It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                  1 Reply Last reply
                  5
                  • L Offline
                    L Offline
                    Lightshadown
                    wrote on last edited by
                    #12

                    ok i ditched the lambda and used a normal function, for some reason it wont work inside the connect signal, but now the socket its lock, and got the error
                    QAbstractSocket::UnfinishedSocketOperationError i have to restart both machines to free the socket, any idea how to free the socket or check the socket if its aviable?

                    void Server::TCP_Request(){
                        Gen L;
                        QString Ip("192.168.1.70");
                        L.Log("antes de coneccion");
                        TCP_socket->abort();
                        TCP_socket->connectToHost( Ip, 8000, QIODevice::ReadWrite );   // do a broadcast and search for servers ip
                        L.Log("tcp conectado");
                            
                        bool yes = false;
                        QByteArray block("Hola, from laptop");
                        //QDataStream salida(&block, QIODevice::WriteOnly);
                    
                        //salida << "Enviando desde laptop ";
                        //block.append("Enviando desde Laptop");
                    
                        if (TCP_socket->isValid()) {
                            L.Log("antes de escribir");
                            TCP_socket->write(block);
                            yes = TCP_socket->flush();
                        //TCP_socket->waitForBytesWritten(100);
                        }
                        if (yes == true){ L.Log("datos enviados");} else {L.Log("no se envio los datos");}
                        TCP_socket->disconnectFromHost();
                        //TCP_socket->abort();
                        L.Log("coneecion terminada");
                        }
                    
                    jsulmJ 1 Reply Last reply
                    0
                    • L Lightshadown

                      ok i ditched the lambda and used a normal function, for some reason it wont work inside the connect signal, but now the socket its lock, and got the error
                      QAbstractSocket::UnfinishedSocketOperationError i have to restart both machines to free the socket, any idea how to free the socket or check the socket if its aviable?

                      void Server::TCP_Request(){
                          Gen L;
                          QString Ip("192.168.1.70");
                          L.Log("antes de coneccion");
                          TCP_socket->abort();
                          TCP_socket->connectToHost( Ip, 8000, QIODevice::ReadWrite );   // do a broadcast and search for servers ip
                          L.Log("tcp conectado");
                              
                          bool yes = false;
                          QByteArray block("Hola, from laptop");
                          //QDataStream salida(&block, QIODevice::WriteOnly);
                      
                          //salida << "Enviando desde laptop ";
                          //block.append("Enviando desde Laptop");
                      
                          if (TCP_socket->isValid()) {
                              L.Log("antes de escribir");
                              TCP_socket->write(block);
                              yes = TCP_socket->flush();
                          //TCP_socket->waitForBytesWritten(100);
                          }
                          if (yes == true){ L.Log("datos enviados");} else {L.Log("no se envio los datos");}
                          TCP_socket->disconnectFromHost();
                          //TCP_socket->abort();
                          L.Log("coneecion terminada");
                          }
                      
                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by jsulm
                      #13

                      @Lightshadown said in unable to send data via QTcpSocket:

                      TCP_socket->disconnectFromHost();

                      You are disconnecting without knowing whether all data was sent (flush() does not guarantee this!).
                      You should listen to https://doc.qt.io/qt-5/qiodevice.html#bytesWritten signal and disconnect when all data was sent.

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

                      L 1 Reply Last reply
                      4
                      • jsulmJ jsulm

                        @Lightshadown said in unable to send data via QTcpSocket:

                        TCP_socket->disconnectFromHost();

                        You are disconnecting without knowing whether all data was sent (flush() does not guarantee this!).
                        You should listen to https://doc.qt.io/qt-5/qiodevice.html#bytesWritten signal and disconnect when all data was sent.

                        L Offline
                        L Offline
                        Lightshadown
                        wrote on last edited by Lightshadown
                        #14

                        @jsulm ok i did try using waitForBytesWritten() and it kinda works, now i can send the data to the server, and i just had to wait for the socket to connect, waitForConnected(1000) like it follows

                        void Server::TCP_Request(){
                            Gen L;
                            QString Ip("192.168.1.70");    
                            bool yes = false;
                            QByteArray block("Hola, from laptop");    
                                    
                            TCP_socket->abort();
                                    
                            if (TCP_socket->state() == QAbstractSocket::UnconnectedState){
                        
                                L.Log("antes de coneccion");
                                TCP_socket->connectToHost( Ip, 8000, QIODevice::ReadWrite );   // do a broadcast and search for servers ip
                                
                                //QDataStream salida(&block, QIODevice::WriteOnly);
                                //salida << "Enviando desde laptop ";
                                //block.append("Enviando desde Laptop");
                                if (TCP_socket->waitForConnected(1000)){
                                    if (TCP_socket->isValid()) { // && TCP_socket->state() == QAbstractSocket::ConnectedState) {
                                        L.Log("antes de escribir");
                                        TCP_socket->write(block);
                                        yes = TCP_socket->flush();
                                        TCP_socket->waitForBytesWritten(1000);
                                    }
                                }
                                if (yes == true){ L.Log("datos enviados");} else {L.Log("no se envio los datos");}
                                TCP_socket->disconnectFromHost();
                                TCP_socket->close();
                                //TCP_socket->abort();
                                L.Log("coneecion terminada");
                        
                            }
                                
                        }
                        

                        also i would check the signal bytes emited and try to figure it out when all the data is sent, next i would check sending files, thanks

                        jsulmJ 1 Reply Last reply
                        0
                        • L Lightshadown

                          @jsulm ok i did try using waitForBytesWritten() and it kinda works, now i can send the data to the server, and i just had to wait for the socket to connect, waitForConnected(1000) like it follows

                          void Server::TCP_Request(){
                              Gen L;
                              QString Ip("192.168.1.70");    
                              bool yes = false;
                              QByteArray block("Hola, from laptop");    
                                      
                              TCP_socket->abort();
                                      
                              if (TCP_socket->state() == QAbstractSocket::UnconnectedState){
                          
                                  L.Log("antes de coneccion");
                                  TCP_socket->connectToHost( Ip, 8000, QIODevice::ReadWrite );   // do a broadcast and search for servers ip
                                  
                                  //QDataStream salida(&block, QIODevice::WriteOnly);
                                  //salida << "Enviando desde laptop ";
                                  //block.append("Enviando desde Laptop");
                                  if (TCP_socket->waitForConnected(1000)){
                                      if (TCP_socket->isValid()) { // && TCP_socket->state() == QAbstractSocket::ConnectedState) {
                                          L.Log("antes de escribir");
                                          TCP_socket->write(block);
                                          yes = TCP_socket->flush();
                                          TCP_socket->waitForBytesWritten(1000);
                                      }
                                  }
                                  if (yes == true){ L.Log("datos enviados");} else {L.Log("no se envio los datos");}
                                  TCP_socket->disconnectFromHost();
                                  TCP_socket->close();
                                  //TCP_socket->abort();
                                  L.Log("coneecion terminada");
                          
                              }
                                  
                          }
                          

                          also i would check the signal bytes emited and try to figure it out when all the data is sent, next i would check sending files, thanks

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

                          @Lightshadown Actually I suggested to use https://doc.qt.io/qt-5/qiodevice.html#bytesWritten signal instead of doing blocking calls to wait. But it is up to you.

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

                          1 Reply Last reply
                          3

                          • Login

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