我想创建一个 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* 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;
}
}