SSLサーバーを作成したいので、QTcpServerをサブクラス化し、オーバーライドしますincomingConnection()
。ここで、を作成しQSslSocket
、その記述子を設定して、を呼び出しますQSslSocket::startServerEncryption
。この時点で、シグナルが発信されるのを待つ必要があります。QSslSocket::encrypted()
その後、サーバーがnewConnection()
シグナルを発信する必要があります。クライアントコードは、QTcpSocketを使用していると見なしますが、実際には安全なソケットを使用しています。
ただし、QTcpServerは newConnection()
呼び出し後に常に出力しますincomingConnection()
(QTcpServerのソースを調べました)。
void QTcpServerPrivate::readNotification()
{
// .........
q->incomingConnection(descriptor);
QPointer<QTcpServer> that = q;
emit q->newConnection();
// .........
}
だから私の質問は、自分で放出する準備ができるまで、放出を防ぐ方法はありますか?QTcpServer
newConnection()
これが必要な理由は、クラスがQTcpServerを使用していることを認識しないコードによって、QTcpServerのドロップイン置換として使用できるようにするためです。したがって、QTcpServerとまったく同じように動作する必要があります。
QTcpServer* getServer(bool ssl)
{
return ssl ? new SslServer : new QTcpServer;
}
SslServerクラスの私のコードは現在これです:
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;
}
}