Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QSslSocket
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
512es
QTcpServer + QSslSocket + QDataStream Ака threaded fortune server.
Пытаюсь прикрутить SSL.. Сгенерировал сертификаты для клиента и для сервера.

Клиент:
tcpSocket->setLocalCertificate("cert/client.crt");
tcpSocket->setPrivateKey("cert/client.key");
tcpSocket->connectToHostEncrypted("localhost",7879);
if (!tcpSocket->waitForEncrypted()) {
    qDebug() << tcpSocket->errorString();
    return;
}


Сервер:
tcpSocket->setPrivateKey("cert/servers.key");
tcpSocket->setLocalCertificate("cert/server.crt");
........................
void slotStateChanged(QAbstractSocket::SocketState state)
{
    switch((int)state) {
    case 3: //QAbstractSocket::ConnectedState
        tcpSocket->startServerEncryption();
        break;
........................
    default:
        qDebug() << "Unknown state! ftom" << userID << tcpSocket->peerAddress().toString() << state;
        break;
    }
}


И сигналы\слоты:
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotSocketError(QAbstractSocket::SocketError)),Qt::DirectConnection);
connect(tcpSocket, SIGNAL(encrypted()), this, SLOT(socketEncrypted()));
connect(tcpSocket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));



Что только не перепробовал.. В лучшем случае выдаётся ошибка QAbstractSocket::SocketError 13 (рукопожатия).

До sslErrors(QList<QSslError>) даже не доходит..

openssl установлен, проблемы в нём быть не должно. Qt собран с ssl.

Куда копать?
Rocky
а переменная "tcpSocket" это QTcpSocket или QSslSoket?... Покажи больше кода чтоли... Может прояснится что..
PAFOS
С сервером все сложнее.... Вот пример SSL сервера:
Раскрывающийся текст
class SslServer : public QTcpServer
{
Q_OBJECT

public:
    SslServer():QTcpServer()
    {}

    QSslCertificate _cert;
    QSslKey _key;


    void incomingConnection(int socketDescriptor);
private slots:
    void ready();
    void sslError( const QList<QSslError> &);
};


void SslServer::incomingConnection(int socketDescriptor)
{
    QSslSocket *serverSocket = new QSslSocket;
    if (serverSocket->setSocketDescriptor(socketDescriptor)) {
        connect(serverSocket, SIGNAL(encrypted()), this, SLOT(ready()));
        connect(serverSocket,SIGNAL(sslErrors(QList<QSslError>)),this,SLOT(sslError(QList<QSslError>)));
        serverSocket->setPrivateKey(_key);
        serverSocket->setLocalCertificate(_cert);

        serverSocket->startServerEncryption();
    } else {
        delete serverSocket;
    }
}

void SslServer::ready()
{
    QSslSocket *serverSocket = dynamic_cast<QSslSocket*>(sender());
    addPendingConnection(serverSocket);
    emit newConnection();
}


void SslServer::sslError( const QList<QSslError> &e)
{
    foreach( const QSslError &er, e )
        qDebug() << er.errorString();
}


Имею ввиду что после отработки void SslServer::incomingConnection(int socketDescriptor) объект сервер вышлет сигнал newConnection(), где server->nextPendingConnection() вернет 0 указатель! - это надо проверять в классе, управляющем сервером

void ServerThread::newConnection()
{
        QTcpSocket *socket = server->nextPendingConnection();
        if( socket == 0 )
            return;

------------

как-то так)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.