我正试图创建一个简单的服务器客户端程序,以便在本地网络中的计算机之间发送数据。为此,我特别使用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;
}
我是这样做的:
- 运行服务器
- 等待2秒钟
- 运行客户端
所以没什么特别的。但结果是:
服务器:1 SSL握手期间出错:错误:14102410:SSL例程:dtls1_read_bytes:sslv3警报握手失败0
客户端:1未知错误0
正如你所看到的,第一次握手确实发生了。问题出在第二个,似乎是服务器代码出了问题。
如果重要的话,我使用的是Ubuntu 20,Qt 5.13,上面提到的IP是正确的,端口也是免费的。
就像一位伟人说的那样:"我想明白了;。所以这个代码有很多问题:
- 在使用QDtls时,您必须注意名为pskRequired((的信号——它是在第二次握手尝试期间调用的,您应该将一些插槽连接到它
- 最好把代码放在一个循环中,检查握手是否完成——认为两次迭代就足够了是不明智的