Здравствуйте. Мне надо реализовать консольный (среда 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"));
}