Может кто-то поделиться рабочим примером реализации клиента и сервера с использованием Qt Ssl на C++?

Не могу найти подходящий пример клиента и сервера на Qt. Хотелось бы увидеть что-то вроде базового эхо-сервера, который также использует шифрование данных при передаче. Всё, что я нашёл, не работает или требует заголовочных файлов, которые, похоже, изначально не входят в комплект.
  • 9 сентября 2024 г. 17:03
Ответы на вопрос 2
Конечно! Я помогу вам создать простой echo-сервер и клиента с использованием Qt и Qt SSL. Для начала, убедитесь, что у вас установлены необходимые модули Qt и QtNetwork.

### 1. Создайте Echo-сервер

Создайте новый проект Qt Console Application и добавьте следующий код для сервера:

```cpp
#include <QTcpServer>
#include <QTcpSocket>
#include <QSslSocket>
#include <QSslCertificate>
#include <QSslKey>
#include <QFile>
#include <QDebug>

class EchoServer : public QTcpServer {
    Q_OBJECT

public:
    EchoServer(QObject *parent = nullptr) : QTcpServer(parent) {
        connect(this, &QTcpServer::newConnection, this, &EchoServer::handleNewConnection);
    }

private slots:
    void handleNewConnection() {
        QSslSocket *clientSocket = dynamic_cast<QSslSocket *>(nextPendingConnection());
        if (clientSocket) {
            clientSocket->startServerEncryption();
            connect(clientSocket, &QSslSocket::readyRead, [clientSocket]() {
                QByteArray data = clientSocket->readAll();
                clientSocket->write(data); // Эхо-ответ
            });
            connect(clientSocket, &QSslSocket::disconnected, clientSocket, &QSslSocket::deleteLater);
        }
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    EchoServer server;

    // Загрузка сертификатов (self-signed certificate)
    QSslCertificate certificate(QFile::readAll(QStringLiteral("server.crt")));
    QSslKey key(QFile::readAll(QStringLiteral("server.key")));

    server.setSslConfiguration(QSslConfiguration::fromCertificateAndPrivateKey(certificate, key));

    if (!server.listen(QHostAddress::Any, 12345)) {
        qFatal("Failed to start server");
    }

    qDebug() << "Server listening on port" << server.serverPort();
    return app.exec();
}

#include "main.moc"
```

### 2. Создайте Echo-клиент

Теперь создайте клиент:

```cpp
#include <QSslSocket>
#include <QCoreApplication>
#include <QDebug>

class EchoClient : public QObject {
    Q_OBJECT

public:
    EchoClient(const QString &host, quint16 port) {
        socket = new QSslSocket(this);
        connect(socket, &QSslSocket::connected, this, &EchoClient::onConnected);
        connect(socket, &QSslSocket::readyRead, this, &EchoClient::onReadyRead);
        socket->connectToHostEncrypted(host, port);
    }

private slots:
    void onConnected() {
        qDebug() << "Connected to server";
        socket->write("Hello, Server!");
    }

    void onReadyRead() {
        QByteArray data = socket->readAll();
        qDebug() << "Received from server:" << data;
        socket->disconnectFromHost();
    }

private:
    QSslSocket *socket;
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);
    EchoClient client("localhost", 12345);
    return app.exec();
}

#include "main.moc"
```

### 3. Генерация SSL сертификатов

Для работы с SSL необходимо сгенерировать самоподписанный сертификат и ключ. Вы можете использовать следующую команду openssl:

```sh
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=localhost"
```

### 4. Запуск сервера и клиента

1. Сначала компилируйте и запускайте сервер.
2. После успешного запуска сервера, компилируйте и запускайте клиент.

### Замечания

- Убедитесь, что размещаете сгенерированные файлы `server.crt` и `server.key` в той же папке, где находится исполняемый файл сервера.
- Обратите внимание на настройки безопасности, если вы планируете использовать данный код в продуктивной среде. Самоподписанные сертификаты не предназначены для использования в реальных приложениях без дополнительной обработки (например, проверки SSL-сертификатов).

Теперь у вас есть базовый echo-сервер и клиент с использованием Qt SSL!
Похожие вопросы