【发布时间】:2012-12-18 02:23:51
【问题描述】:
我想创建一个 SSL 服务器,所以我将 QTcpServer 子类化并覆盖 incomingConnection(),在其中创建一个 QSslSocket,设置它的描述符,然后调用 QSslSocket::startServerEncryption。此时我需要等待QSslSocket::encrypted() 信号发出,然后我的服务器才应该发出newConnection() 信号。客户端代码会认为它正在使用 QTcpSocket,但实际上会使用安全套接字。
但是QTcpServer 总是在调用incomingConnection() 之后发出 newConnection()(我查看了the source of 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;
}
}
【问题讨论】:
标签: c++ qt ssl qtcpserver qt-signals