Je veux créer un serveur SSL, donc je sous-classe QTcpServer et je remplace incomingConnection()
, où je crée un QSslSocket
, définissez son descripteur, et appelez QSslSocket::startServerEncryption
. À ce stade, je dois attendre que le signal QSslSocket::encrypted()
soit émis, et ce n'est qu'après que mon serveur devrait émettre le signal newConnection()
. Le code client penserait alors qu'il utilise un QTcpSocket, mais utilisera en fait une socket sécurisée.Lors du sous-classement de QTcpServer, comment puis-je retarder l'émission du signal newConnection()?
Mais QTcpServer émet toujoursnewConnection()
après avoir appelé incomingConnection()
(j'ai regardé dans the source of QTcpServer):
void QTcpServerPrivate::readNotification()
{
// .........
q->incomingConnection(descriptor);
QPointer<QTcpServer> that = q;
emit q->newConnection();
// .........
}
Donc ma question est, est-il un moyen que je peux empêcher QTcpServer
d'émettre newConnection()
, jusqu'à ce que je suis prêt à l'émettre moi-même?
La raison pour laquelle je veux que c'est que je veux que ma classe pour pouvoir être utilisé comme solution de remplacement de QTcpServer, par un code qui ne sait pas qu'il utilise, donc il doit se comporter exactement comme QTcpServer:
QTcpServer* getServer(bool ssl)
{
return ssl ? new SslServer : new QTcpServer;
}
Mon code pour la classe sslserver est actuellement ceci:
void SslServer::ready()
{
QSslSocket *socket = (QSslSocket *) sender();
addPendingConnection(socket);
emit newConnection();
}
void SslServer::incomingConnection(int socketDescriptor)
{
QSslSocket *serverSocket = new QSslSocket;
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
connect(serverSocket, SIGNAL(encrypted()), this, SLOT(ready()));
serverSocket->startServerEncryption();
} else {
delete serverSocket;
}
}
Qu'en est-il de déconnecter le signal et de le reconnecter plus tard? C'est possible? Et non, certainement pas de réécriture des sources Qt :) – sashoalm
Vous pouvez l'essayer: ['QObject :: disconnect'] (http://qt-project.org/doc/qt-4.8/qobject.html#disconnect). Je ne l'ai pas fait assez pour le savoir bien. – phyatt
Le problème est que j'ai besoin de rebrancher le signal plus tard, donc j'ai besoin d'obtenir la liste des récepteurs pour ce signal en quelque sorte. Je publie ceci comme une nouvelle question - http://stackoverflow.com/q/14144415/492336. – sashoalm