Не подключается QTcpSocket к QTcpServer
Всем привет. Я не то что бы сильно давно в программировании, а тем более плюсах и сетевом коде, но... Пытаюсь сделать клиент-сервер на Qt. Самый простейший. И на самом первом же шаге полный ступор. Создал сервер. вот код: mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QStringList>
#include <QString>
#include <QDateTime>
#include <QUdpSocket>
#include "server.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QUdpSocket *usocket;
QStringList List;
public slots:
void NewString(QString message);
void NewIncomingConnection();
void UDPIncoming();
};
#endif // MAINWINDOW_H
server.h
#ifndef SERVER_H
#define SERVER_H
#include <QTcpServer>
#include <QTcpSocket>
#include <QVariant>
class Server : public QTcpServer
{
Q_OBJECT
public:
Server();
QTcpSocket *socket;
bool isServerListening();
signals:
void NewString(QString string);
public slots:
void incomingConnection(qintptr handle);
void newConnection();
};
#endif // SERVER_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Server s;
connect(&s, &QTcpServer::newConnection, this, &MainWindow::NewIncomingConnection);
s.listen(QHostAddress::Any, 33333);
connect(&s, &Server::NewString, this, &MainWindow::NewString);
s.isServerListening();
usocket = new QUdpSocket;
usocket->bind(QHostAddress("127.0.0.1"), 33334);
connect(usocket, &QUdpSocket::readyRead, this, &MainWindow::UDPIncoming);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::NewString(QString message)
{
ui->listWidget->blockSignals(true);
ui->listWidget->clear();
List.push_front(QTime::currentTime().toString("hh:mm:ss")+" |:| "+message);
ui->listWidget->addItems(List);
ui->listWidget->blockSignals(false);
}
void MainWindow::NewIncomingConnection()
{
qDebug() << "Новое подключение";
}
void MainWindow::UDPIncoming()
{
qDebug() << "Новое сообщение";
}
server.cpp
#include "server.h"
#include <QNetworkProxy>
Server::Server()
{
}
bool Server::isServerListening()
{
emit(NewString("Привет"));
if(this->isListening()) {
emit(NewString("Я слушаю "+this->serverAddress().toString()+" : "+QVariant(this->serverPort()).toString()));
return true;
}
else {
emit(NewString("Ошибка : "+this->errorString()));
return false;
}
}
void Server::incomingConnection(qintptr handle)
{
socket = new QTcpSocket;
socket->setSocketDescriptor(handle);
qDebug() << "Новое подключение";
emit(NewString("Новое подключение"));
}
void Server::newConnection()
{
socket = new QTcpSocket;
qDebug() << "Новое подключение 2";
}
И при запуске сервера все хорошо. Сервер запускается и слушает порт 33333
Но при попытке подключения клиента сервер находится и все. errorString в QTcpSocket выводит Connection Refused
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket *socket;
QUdpSocket *usocket;
public slots:
void HostFound();
void HostConnected();
void SocketState();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::hostFound, this, &MainWindow::HostFound);
connect(socket, &QTcpSocket::connected, this, &MainWindow::HostConnected);
connect(socket, &QTcpSocket::stateChanged, this, &MainWindow::SocketState);
qDebug() << socket->state();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
socket->connectToHost("127.0.0.1", 33333);
qDebug() << socket->state();
}
void MainWindow::HostFound()
{
qDebug() << "Host Found" << socket->peerName();
}
void MainWindow::HostConnected()
{
qDebug() << "Host connected";
qDebug() << socket->state();
}
void MainWindow::SocketState()
{
qDebug() << socket->state();
if(socket->errorString() != "Unknown error") {
qDebug() << socket->errorString();
}
}
Ответы (1 шт):
Автор решения: DelloMorter
→ Ссылка
Server s;
- сделайте его членом класса. У вас он уничтожается при выходе из MainWindow::MainWindow
– Alex F