【问题标题】:Calling QSslSocket::startServerEncryption, but nothing happens调用 QSslSocket::startServerEncryption,但没有任何反应
【发布时间】:2012-12-20 07:54:54
【问题描述】:

我正在尝试使用 Qt 文档中的示例代码来实现 SSL 服务器。

但是在调用serverSocket->startServerEncryption(); 之后,什么都没有发生——encrypted()sslErrors() 信号都没有发出(我已经在连接到它们的槽中放置了断点)。

我通过使用connectToHostEncrypted 将QSslSocket 连接到我正在侦听的端口来测试它。套接字发送数据,但我的服务器没有响应(我正在使用 TCP 嗅探器/代理来查看从客户端发送到服务器以及从服务器发送到客户端的所有数据)。

这是我的服务器代码:

void SslServer::incomingConnection(int socketDescriptor)
{
    qDebug() << "SslServer::incomingConnection()";
    QSslSocket *serverSocket = new QSslSocket(this);
    if (serverSocket->setSocketDescriptor(socketDescriptor)) {
        connect(serverSocket, SIGNAL(encrypted()), this, SLOT(ready()));
        connect(serverSocket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));
        serverSocket->startServerEncryption();
    } else {
        delete serverSocket;
    }
}

这就是我连接它的方式:

server = new SslServer(this);
server->listen(QHostAddress::Any, 3333);
QSslSocket *socket = new QSslSocket(this);
socket->connectToHostEncrypted("127.0.0.1", 3333);

【问题讨论】:

    标签: c++ qt sockets ssl qsslsocket


    【解决方案1】:

    SSH 不是 SSL。 SSH 客户端等待来自服务器的初始数据,而 SSL 客户端首先发送数据。所以他们都在等待对方的数据。

    【讨论】:

    • 感谢您指出这一点。我已经编辑了我的问题,现在我正在使用QSslSocket::connectToHostEncrypted 进行测试,但问题仍然存在。另外,现在我确定客户端确实发送了数据,因为我正在记录来自 TCP 连接的所有数据。
    【解决方案2】:

    根据documentation

    如果您要创建 SSL 服务器套接字,则需要密钥和本地证书。

    如果您不提供它们,则套接字会发出“常规”error(QAbstractSocket::SocketError) 信号。如您所见,在这种情况下,服务器不会发送任何数据。

    【讨论】:

    • 谢谢,我原以为连接sslErrors 就足够了。我连接了error 信号,它发出QAbstractSocket::UnknownSocketError 错误。
    • 我使用 QSslSocket::errorString 发现了更多关于错误的信息。我现在已经编辑了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多