处理握手时出现Qt QDtls错误



我正试图创建一个简单的服务器客户端程序,以便在本地网络中的计算机之间发送数据。为此,我特别使用Qt网络和QDtl。我想做一个小测试,以确保一切正常。事实并非如此。下面是我在服务器部分的内容:

int main() {
QUdpSocket serverSocket;
serverSocket.bind(QHostAddress("192.168.1.73"), 22334);
serverSocket.waitForReadyRead(-1);
QByteArray clientHello(serverSocket.pendingDatagramSize(), Qt::Uninitialized);
QHostAddress address;
quint16 port = {};
serverSocket.readDatagram(clientHello.data(), clientHello.size(), &address, &port);
QDtls serverDtls(QSslSocket::SslServerMode);
auto config = QSslConfiguration::defaultDtlsConfiguration();
config.setDtlsCookieVerificationEnabled(false);
serverDtls.setDtlsConfiguration(config);
serverDtls.setPeer(address, port);

bool v = serverDtls.doHandshake(&serverSocket, clientHello);
std::cout << v << " ";
serverSocket.waitForReadyRead(-1);
serverSocket.readDatagram(clientHello.data(), clientHello.size(), &address, &port);
v = serverDtls.doHandshake(&serverSocket, clientHello);
std::cout << serverDtls.dtlsErrorString().toStdString();
std::cout << " " << v;

这是客户端代码:

int main() {
QDtls a(QSslSocket::SslClientMode);
QUdpSocket b;
a.setPeer(QHostAddress("192.168.1.73"), 22334);
auto config = QSslConfiguration::defaultDtlsConfiguration();
config.setDtlsCookieVerificationEnabled(false);
a.setDtlsConfiguration(config);
b.connectToHost(QHostAddress("192.168.1.73"), 22334);

bool v = a.doHandshake(&b);
std::cout << v;

b.waitForReadyRead(-1);
quint16 port;
QHostAddress address;
QByteArray server_hello(b.pendingDatagramSize(), Qt::Uninitialized);
b.readDatagram(server_hello.data(), server_hello.size(), &address, &port);
std::cout << b.errorString().toStdString();
bool k = a.doHandshake(&b, server_hello);
std::cout << k;
}

我是这样做的:

  1. 运行服务器
  2. 等待2秒钟
  3. 运行客户端

所以没什么特别的。但结果是:

服务器:1 SSL握手期间出错:错误:14102410:SSL例程:dtls1_read_bytes:sslv3警报握手失败0

客户端:1未知错误0

正如你所看到的,第一次握手确实发生了。问题出在第二个,似乎是服务器代码出了问题。

如果重要的话,我使用的是Ubuntu 20,Qt 5.13,上面提到的IP是正确的,端口也是免费的。

就像一位伟人说的那样:"我想明白了;。所以这个代码有很多问题:

  1. 在使用QDtls时,您必须注意名为pskRequired((的信号——它是在第二次握手尝试期间调用的,您应该将一些插槽连接到它
  2. 最好把代码放在一个循环中,检查握手是否完成——认为两次迭代就足够了是不明智的

相关内容

  • 没有找到相关文章

最新更新