Russian Qt Forum

Qt => Работа с сетью => Тема начата: npospelov от Сентябрь 24, 2013, 14:33



Название: QTcpServer + QSslSocket проблема
Отправлено: npospelov от Сентябрь 24, 2013, 14:33
Здравствуйте! Имеется следующий класс:
Код:
class QSslServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit QSslServer(QObject *parent = 0);
    virtual void incomingConnection( int socketDescriptor );

private:
    QSslSocket *serverSocket;

signals:
public slots:    
    void socketReady();
    void socketSslErrors(const QList<QSslError> &errors);
    void socketError(QAbstractSocket::SocketError socketError);
};

Переопределённый метод incomingConnection:
Код:
void QSslServer::incomingConnection(int socketDescriptor)
{
    serverSocket = new QSslSocket(this);
................
................
................
    if (serverSocket->setSocketDescriptor(socketDescriptor))
    {
        bool result = QObject::connect(serverSocket, SIGNAL(encrypted()), this, SLOT(socketReady()));
        result = QObject::connect(serverSocket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(socketSslErrors(const QList<QSslError> &)));
        result = QObject::connect(serverSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));

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

Далее есть класс, в котором работаем с объектом класса QSslServer:

Код:
class SslServer : public QObject
{
    Q_OBJECT
public:
    explicit SslServer(QObject *parent = 0);
..................
private:
    QSslServer * sslServer;
..................
signals:
public slots:
    void start();
    void onNewConnection();
    void onReadyRead();
};
В нём есть слот onNewConnection(), который соединён с сигналом newConnection()
Код:
QObject::connect( sslServer, SIGNAL( newConnection() ), this, SLOT( onNewConnection() ) );
Код:
void SslServer::onNewConnection()
{    
    if ( sslServer->hasPendingConnections() )
    {
        QTcpSocket * clientSocket = sslServer->nextPendingConnection();
        QObject::connect(clientSocket, SIGNAL(disconnected()), clientSocket, SLOT(deleteLater()));
        QObject::connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    }
}

При подключении клиента вызывается incomingConnection(), потом onNewConnection(), однако sslServer->hasPendingConnections() возвращает false. В общем то в этом и заключается проблема. Что я делаю не так?
При этом на сервере и на клиенте эмитятся сигналы encrypted().

Update: версия Qt - 4.6.2


Название: Re: QTcpServer + QSslSocket проблема
Отправлено: LisandreL от Сентябрь 25, 2013, 06:43
Что я делаю не так?
В переопределённом incomingConnection не вызываете addPendingConnection, но ожидаете, что сокет без этого каким-то волшебным образом станет в очередь.


Название: Re: QTcpServer + QSslSocket проблема
Отправлено: npospelov от Сентябрь 25, 2013, 08:01
В переопределённом incomingConnection не вызываете addPendingConnection, но ожидаете, что сокет без этого каким-то волшебным образом станет в очередь.
К сожалению, в Qt 4.6.2 с которым приходится работать, этого метода нет (


Название: Re: QTcpServer + QSslSocket проблема
Отправлено: npospelov от Сентябрь 25, 2013, 13:47
Всё, разобрался. По этой ссылке (http://qt-project.org/forums/viewthread/21799) разбирается подобная проблема )