Russian Qt Forum
Ноябрь 23, 2024, 11:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpServer + QSslSocket проблема  (Прочитано 4030 раз)
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
« Последнее редактирование: Сентябрь 24, 2013, 14:56 от npospelov » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Сентябрь 25, 2013, 06:43 »

Что я делаю не так?
В переопределённом incomingConnection не вызываете addPendingConnection, но ожидаете, что сокет без этого каким-то волшебным образом станет в очередь.
Записан
npospelov
Гость
« Ответ #2 : Сентябрь 25, 2013, 08:01 »

В переопределённом incomingConnection не вызываете addPendingConnection, но ожидаете, что сокет без этого каким-то волшебным образом станет в очередь.
К сожалению, в Qt 4.6.2 с которым приходится работать, этого метода нет (
Записан
npospelov
Гость
« Ответ #3 : Сентябрь 25, 2013, 13:47 »

Всё, разобрался. По этой ссылке разбирается подобная проблема )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 23.