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 605 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.
  • JonBJ JonB

    @Lightshadown said in unable to send data via QTcpSocket:

    when the connection its made the &QTcpSocket::readyRead signal should trigger the lambda

    No, connecting does not fire this. Only if the server sends some data would this be emitted, no reason to suppose your Python server does that.

    Your question talks about failure to send any data, yet your code does not attempt to send any data, only read data. Maybe that is all your problem is?

    QObject::connect(TCP_socket, &QAbstractSocket::errorOcurred, [&](QAbstractSocket::SocketError error){
    ...
    

    This line will not compile. So either that is what you mean by "but it wont work for some reason" --- in which case it would be much better to state that it does not compile --- or it means you have not copied & pasted your actual, compilable, working code --- in which case, from experience answering questions here, all bets are off.

    Back in Qt 5.11 you still have an error signal, just it used to be called error() instead.

    I suggest you start by connecting the client's stateChanged() signal and seeing what changes it undergoes.

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

    @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 1 Reply Last reply
    0
    • 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 Offline
            J.HilkJ Offline
            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