Russian Qt Forum

Qt => Работа с сетью => Тема начата: Gregory_E от Март 03, 2018, 11:36



Название: QSslSocket консольный эхо-сервер
Отправлено: Gregory_E от Март 03, 2018, 11:36
Здравствуйте. Мне надо реализовать консольный (среда Ubuntu), клиент-сервер, для обмена короткими текстовыми данными. И данные должны быть зашифрованы. Я попробовал реализовать на QSslSocket, но до конца не понимаю как все должно работать. Нужны ли клиенту изначально указанные в коде ключ/сертификат ? Был бы рад примеру кода.

main:
Код
C++ (Qt)
#include <QCoreApplication>
#include <QTcpServer>
#include <QSslSocket>
#include <QObject>
#include "sslserver.h"
 
 
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
 
 
   SslServer server(4242);
 
 
 
   return a.exec();
}
 
[b]sslserver.h:[/b]
#ifndef SSLSERVER_H
#define SSLSERVER_H
 
#include <QCoreApplication>
#include <QTcpServer>
#include <QSslSocket>
#include <QObject>
#include <QDebug>
 
 
 
class SslServer : public QTcpServer
{
   Q_OBJECT
public:
    SslServer(QObject *parent = 0);
    SslServer(int portN);
    SslServer() = default;
private:
   int port;
   void incomingConnection(int handle);
   QSslSocket *socket;
signals:
   void message(QString);
public slots:
   void on_encrypted();
   void on_dataRead();
};
 
 
 
#endif // SSLSERVER_H

sslserver.cpp:
Код
C++ (Qt)
#include "sslserver.h"
 
 
 
SslServer::SslServer(QObject *parent) :
   QTcpServer(parent)
{
 
   //listen(QHostAddress::Any, port);
}
 
 
 
SslServer::SslServer(int portN)
{
   port = portN;
   listen(QHostAddress::Any, port);
}
 
void SslServer::incomingConnection(int handle)
{
   socket = new QSslSocket(this);
 
   if (socket->setSocketDescriptor(handle))
   {
       qDebug() << "Incoming connection.";
 
       connect(socket, SIGNAL(encrypted()), this, SLOT(on_encrypted()));
       connect(socket, SIGNAL(readyRead()), this, SLOT(on_dataRead()));
 
       socket->setPrivateKey("/home/gregory/rootCA.key", QSsl::Rsa);
       socket->setLocalCertificate("/home/gregory/rootCA.crt");
       socket->startServerEncryption();
 
       emit message("New connection...\r\n");
       foreach(QSslError err, socket->sslErrors())
       {
           emit message(QString(err.errorString()).append("\r\n"));
       }
 
   }
   else {
       //qDebug() << "Else";
       delete socket;
   }
}
void SslServer::on_dataRead()
{
   QByteArray arr = socket->readAll();
   emit message(QString(arr).append("\r\n"));
 
}
void SslServer::on_encrypted()
{
   emit message(QString("Encrypted... \r\n"));
}