gpt4 book ai didi

qt - 在 Qt 中使用 QSslSocket 的 SSL 服务器

转载 作者:太空宇宙 更新时间:2023-11-03 14:54:44 24 4
gpt4 key购买 nike

我已经使用 QSslSocket 实现了一个 ssl 服务器并正确运行了它。但是我遇到了一些问题,无法立即解决。我认为只需将 readyRead() 信号连接到用于读取缓冲区的插槽就足以做到这一点,但我已经认识到 readyRead() 在这种情况下根本不会发出,我还必须在我的代码中使用 waitForReadyRead() 函数。但问题是使用这个函数会导致阻塞读取缓冲区。其实我想知道当数据到达时如何不阻塞地读取缓冲区?

下面是我实现的 ssl 服务器:

#include "sslserver.h"
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <QFile>
#include <QtNetwork/QSslKey>
#include <QtNetwork/QSslConfiguration>
#include <QtNetwork/QSslError>

SslServer::SslServer(QObject *parent) : QTcpServer(parent)
{
server = new QTcpServer(this);

if(!server->listen(QHostAddress::Any, 9996))
{
qDebug() << "Server could not start";
}
else
{
qDebug() << "Server started!";
}

connect(server, SIGNAL(newConnection()), this, SLOT(newConnectionRecognized()));

}

void SslServer::showErrors()
{
this-> err = socket->sslErrors();
for(int i=0;i<err.size();i++)
qDebug() << err[i];
}

SslServer::~SslServer()
{

}

void SslServer::newConnectionRecognized()
{

incomingConnection(server->nextPendingConnection()->socketDescriptor());

}

void SslServer::incomingConnection(qintptr socketDescriptor)
{
socket = new QSslSocket(this);
socket->setProtocol(QSsl::SslV3);

connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(showErrors()));
connect(socket, SIGNAL(encrypted()), this, SLOT(ready()));
connect(socket, SIGNAL(readyRead()), this, SLOT(readChannel()));

// Read Key from file

QByteArray key;
QFile KeyFile("server.key");
if(KeyFile.open(QIODevice::ReadOnly))
{
key = KeyFile.readAll();
KeyFile.close();
}
else
{
qDebug() << KeyFile.errorString();
}

QSslKey sslKey(key, QSsl::Rsa);
socket->setPrivateKey(sslKey);


// Load server ssl certificate from file
QByteArray cert;
QFile CertFile("server.csr");
if(CertFile.open(QIODevice::ReadOnly))
{
cert = CertFile.readAll();
CertFile.close();
}
else
{
qDebug() << CertFile.errorString();
}

QSslCertificate sslCert(cert);
socket->setLocalCertificate(sslCert);

QSslConfiguration cfg = socket->sslConfiguration();
cfg.caCertificates();

if (!socket->setSocketDescriptor(socketDescriptor))ee
{
qDebug() << ("! Couldn't set socket descriptor");
delete socket;
return;
}

socket->startServerEncryption();

if (socket->isEncrypted())
emit socket->encrypted();

if(!socket->waitForEncrypted(3000)) {
qDebug("Wait for encrypted!!!!");
return;
}

while (true) {
socket->waitForReadyRead();
}
}


void SslServer::readChannel()
{
QByteArray qstrbytes = socket->readLine();
qDebug() << qstrbytes;

}

void SslServer::ready()
{
qDebug() << "Encrypted";
}

最佳答案

我在实现另一个客户端/服务器时发现了问题,但这次是使用 QTcpSocket。我不知道为什么,但我想问题是因为使用 socketDescriptor 创建 QSslSocket。当我使用 QTcpSocket 创建客户端和服务器时,它们可以在没有任何事件循环的情况下完美运行,只需将 readyRead() 信号连接到插槽即可。之后,为了测试一些情况,我使用 socketDescriptor 创建了 QTcpSocket。然后我发现问题出在使用 socketDescriptor 创建套接字,因为这次 readyRead() 信号不像以前那样工作。

关于qt - 在 Qt 中使用 QSslSocket 的 SSL 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com