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. simple tcp socket program fails when QPushButton click!
QtWS25 Last Chance

simple tcp socket program fails when QPushButton click!

Scheduled Pinned Locked Moved Solved General and Desktop
3 Posts 2 Posters 584 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.
  • Mandar KhireM Offline
    Mandar KhireM Offline
    Mandar Khire
    wrote on last edited by
    #1

    Hi,
    I am learning simple tcp socket program in qt so I use program which I found in INTERNET.
    When I run it as it is, then I can see socket is created & message transfered properly.
    But when I try to use it with GUI ie. I create one QWidget which has one QPushButton & when this button click my aim is to open socket & transfer message. But I failed. I doesnt know where I am wrong.
    For reference code is as below:-
    Headers

    1. client.h
    #ifndef CLIENT_H
    #define CLIENT_H
    // client.h
    #include <QtNetwork>
    #include <QObject>
    #include <QString>
    #include <QTcpSocket>
    
    class Client: public QObject
    {
        Q_OBJECT
    public:
        Client(QObject* parent = 0);
        ~Client();
        void start(QString address, quint16 port);
    public slots:
        void startTransfer();
    private:
        QTcpSocket client;
    };
    #endif // CLIENT_H
    
    
    1. MainWindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QObject>
    #include "client.h"
    #include "server.h"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    
    
    };
    
    #endif // MAINWINDOW_H
    
    
    1. server.h
    #ifndef SERVER_H
    #define SERVER_H
    #include <QtNetwork>
    #include <QObject>
    #include <QTcpServer>
    #include <QTcpSocket>
    
    
    class Server: public QObject
    {
        Q_OBJECT
    public:
        Server(QObject  * parent = 0);
        ~Server();
    public slots:
        void acceptConnection();
        void startRead();
    private:
        QTcpServer server;
        QTcpSocket* tcpSocket;
        QString recievedmessage;
    };
    #endif // SERVER_H
    
    

    Sources

    1. client.cc
    #include "client.h"
    #include <QHostAddress>
    
    
    Client::Client(QObject* parent): QObject(parent)
    {
        connect(&client, SIGNAL(connected()),this, SLOT(startTransfer()));
    }
    
    Client::~Client()
    {
        client.close();
    }
    
    void Client::start(QString address, quint16 port)
    {
        QHostAddress addr(address);
        client.connectToHost(addr, port);
    }
    
    void Client::startTransfer()
    {
        QString message = "hello World Server";
         qDebug() << "client transfer message = "<< message;
        int message_length = message.length();
        client.write(message.toStdString().c_str(),message_length);
        //  client.write("Hello World Mandar12345", 23);
    
    }
    
    1. server.cc
    #include "server.h"
    #include <iostream>
    using namespace std;
    
    Server::Server(QObject *parent): QObject(parent)
    {
        connect(&server, SIGNAL(newConnection()),
                this, SLOT(acceptConnection()));
        server.listen(QHostAddress::Any, 8888);  //8888
    }
    
    Server::~Server()
    {
        //    server.close();
    }
    
    void Server::acceptConnection()
    {
        tcpSocket = server.nextPendingConnection();
    
        connect(tcpSocket, SIGNAL(readyRead()),
                this, SLOT(startRead()));
    
    }
    
    void Server::startRead()
    {
        char buffer[1024] = {0};
        //  QTcpSocket* socket = qobject_cast< QTcpSocket* >(sender());
        //  tcpSocket = qobject_cast< QTcpSocket* >(sender());
        //  qDebug() << tcpSocket->readAll();
        tcpSocket->read(buffer, tcpSocket->bytesAvailable());
        recievedmessage = "message = " + QString::fromStdString(buffer);
        cout << buffer << endl;
        qDebug() << "recievedmessage = "<< recievedmessage;
        tcpSocket->close();
    }
    
    1. main.cpp
    #include "client.h"
    #include "server.h"
    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
    
        //    Client client;
        //    client.start("127.0.0.1", 8888); 
        //    Server server;
        MainWindow w;
        w.show();
        return app.exec();
    }
    
    1. MainWindow.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "client.h"
    #include "server.h"
    #include <iostream>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        Client client;
        client.start("127.0.0.1", 8888);
        Server server;
    }
    
    

    Need a guidance!

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi
      Its a classic error where your variable runs out of scope and get deleted.
      You must move the variable to mainwindow.h as a member so it will live
      as long as mainwindow.

      void MainWindow::on_pushButton_clicked()
      {
      Client client; <<< local variable
      client.start("127.0.0.1", 8888);
      Server server; <<< local variable
      } //here server+client is deleted.

      1 Reply Last reply
      3
      • Mandar KhireM Offline
        Mandar KhireM Offline
        Mandar Khire
        wrote on last edited by
        #3

        Thanks mrjj,
        Now I understand why variable should kept in header file.
        Thanks.

        1 Reply Last reply
        1

        • Login

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