이 페이지에서

QDtls Class

이 클래스는 UDP 소켓에 대한 암호화 기능을 제공합니다. 더 보기...

헤더: #include <QDtls>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
상속: QObject

공개 유형

GeneratorParameters
enum HandshakeState { HandshakeNotStarted, HandshakeInProgress, PeerVerificationFailed, HandshakeComplete }

공개 함수

QDtls(QSslSocket::SslMode mode, QObject *parent = nullptr)
virtual ~QDtls()
bool abortHandshake(QUdpSocket *socket)
QDtls::GeneratorParameters cookieGeneratorParameters() const
QByteArray decryptDatagram(QUdpSocket *socket, const QByteArray &dgram)
bool doHandshake(QUdpSocket *socket, const QByteArray &dgram = {})
QSslConfiguration dtlsConfiguration() const
QDtlsError dtlsError() const
QString dtlsErrorString() const
bool handleTimeout(QUdpSocket *socket)
QDtls::HandshakeState handshakeState() const
void ignoreVerificationErrors(const QList<QSslError> &errorsToIgnore)
bool isConnectionEncrypted() const
quint16 mtuHint() const
QHostAddress peerAddress() const
quint16 peerPort() const
QList<QSslError> peerVerificationErrors() const
QString peerVerificationName() const
bool resumeHandshake(QUdpSocket *socket)
QSslCipher sessionCipher() const
QSsl::SslProtocol sessionProtocol() const
bool setCookieGeneratorParameters(const QDtls::GeneratorParameters &params)
bool setDtlsConfiguration(const QSslConfiguration &configuration)
void setMtuHint(quint16 mtuHint)
bool setPeer(const QHostAddress &address, quint16 port, const QString &verificationName = {})
bool setPeerVerificationName(const QString &name)
bool shutdown(QUdpSocket *socket)
QSslSocket::SslMode sslMode() const
qint64 writeDatagramEncrypted(QUdpSocket *socket, const QByteArray &dgram)

신호

void handshakeTimeout()
void pskRequired(QSslPreSharedKeyAuthenticator *authenticator)
enum class QDtlsError { NoError, InvalidInputParameters, InvalidOperation, UnderlyingSocketError, RemoteClosedConnectionError, …, TlsNonFatalError }

상세 설명

QDtls 클래스는 UDP(User Datagram Protocol)를 사용하여 네트워크 피어와 보안 연결을 설정하는 데 사용할 수 있습니다. 본질적으로 비연결형인 UDP를 통한 DTLS 연결은 두 피어가 먼저 doHandshake()를 호출하여 TLS 핸드셰이크를 성공적으로 완료해야 함을 의미합니다. 핸드셰이크가 완료된 후에는 ` writeDatagramEncrypted()`를 사용하여 피어에게 암호화된 데이터그램을 전송할 수 있습니다. 피어로부터 수신된 암호화된 데이터그램은 ` decryptDatagram()`를 통해 복호화할 수 있습니다.

QDtls는 QUdpSocket 와 연동되도록 설계되었습니다. QUdpSocket 는 서로 다른 피어로부터 전송된 데이터그램을 수신할 수 있으므로, 애플리케이션은 디멀티플렉싱을 구현하여 서로 다른 피어로부터 온 데이터그램을 해당 QDtls 인스턴스로 전달해야 합니다. 네트워크 피어와 해당 QDtls 객체 간의 연결은 피어의 주소와 포트 번호를 사용하여 설정할 수 있습니다. 핸드셰이크를 시작하기 전에, 애플리케이션은 setPeer()를 사용하여 피어의 주소와 포트 번호를 설정해야 합니다.

QDtls는 ` QUdpSocket`에서 데이터그램을 읽지 않으며, 이는 애플리케이션에서 수행해야 합니다(예: ` QUdpSocket::readyRead()` 신호에 연결된 슬롯에서). 그런 다음, 이러한 데이터그램은 QDtls에 의해 처리되어야 합니다.

참고: QDtls는 QUdpSocket 객체의 소유권을 인수하지 않습니다.

일반적으로 핸드셰이크 단계 동안 양쪽 피어 모두 여러 개의 데이터그램을 수신하고 전송하게 됩니다. 데이터그램을 읽은 후, 서버와 클라이언트는 오류가 발견되거나 handshakeState()가 HandshakeComplete 를 반환할 때까지 해당 데이터그램을 doHandshake()로 전달해야 합니다:

// A client initiates a handshake:
QUdpSocket clientSocket;
QDtls clientDtls;
clientDtls.setPeer(address, port, peerName);
clientDtls.doHandshake(&clientSocket);

// A server accepting an incoming connection; address, port, clientHello are
// read by QUdpSocket::readDatagram():
QByteArray clientHello(serverSocket.pendingDatagramSize(), Qt::Uninitialized);
QHostAddress address;
quin16 port = {};
serverSocket.readDatagram(clientHello.data(), clientHello.size(), &address, &port);

QDtls serverDtls;
serverDtls.setPeer(address, port);
serverDtls.doHandshake(&serverSocket, clientHello);

// Handshake completion, both for server and client:
void DtlsConnection::continueHandshake(const QByteArray &datagram)
{
    if (dtls.doHandshake(&udpSocket, datagram)) {
        // Check handshake status:
        if (dtls.handshakeStatus() == QDlts::HandshakeComplete) {
            // Secure DTLS connection is now established.
        }
    } else {
        // Error handling.
    }
}

서버의 경우, ` doHandshake()`에 대한 첫 번째 호출에는 `ClientHello` 메시지가 포함된 비어 있지 않은 데이터그램이 필요합니다. 서버가 ` QDtlsClientVerifier`도 구현하고 있는 경우, 첫 번째 `ClientHello` 메시지는 ` QDtlsClientVerifier`에 의해 검증된 메시지여야 합니다.

핸드셰이크 중에 상대방의 신원을 검증할 수 없는 경우, 애플리케이션은 peerVerificationErrors()가 반환한 오류를 확인한 후, ignoreVerificationErrors()를 호출하여 오류를 무시하거나 abortHandshake()를 호출하여 핸드셰이크를 중단해야 합니다. 오류를 무시한 경우, resumeHandshake()를 호출하여 핸드셰이크를 재개할 수 있습니다.

핸드셰이크가 완료된 후에는 네트워크 상대방과 안전하게 데이터그램을 주고받을 수 있습니다:

// Sending an encrypted datagram:
dtlsConnection.writeDatagramEncrypted(&clientSocket, "Hello DTLS server!");

// Decryption:
QByteArray encryptedMessage(dgramSize);
socket.readDatagram(encryptedMessage.data(), dgramSize);
const QByteArray plainText = dtlsConnection.decryptDatagram(&socket, encryptedMessage);

shutdown()를 사용하여 DTLS 연결을 종료할 수 있습니다.

DtlsClient::~DtlsClient()
{
    clientDtls.shutdown(&clientSocket);
}

경고: 나중에 동일한 포트 번호를 사용하여 서버에 다시 연결할 계획이라면, 클라이언트의 QDtls 객체를 파기하기 전에 shutdown()를 호출하는것이 좋습니다 . 그렇지 않으면 서버가 수신되는 ClientHello 메시지를 거부할 수 있습니다. 자세한 내용과 구현 팁은 RFC 6347, 4.2.8절을 참조하십시오.

서버가 QDtlsClientVerifier 를 사용하지 않는 경우, 쿠키 검증 절차를 비활성화하도록 QDtls 객체를 구성해야 합니다:

auto config = QSslConfiguration::defaultDtlsConfiguration();
config.setDtlsCookieVerificationEnabled(false);
// Some other customization ...
dtlsConnection.setDtlsConfiguration(config);

기본값이 아닌 생성기 매개변수를 사용하여 쿠키 검증을 수행하는 서버는 핸드셰이크를 시작하기 전에 QDtls 객체에 동일한 매개변수를 설정해야 합니다.

참고: DTLS프로토콜은 경로 최대 전송 단위(PMTU) 탐지를 애플리케이션에 맡깁니다. 애플리케이션은 setMtuHint()를 사용하여 QDtls에 MTU를 제공할 수 있습니다. 이 힌트는 핸드셰이크 단계에만 영향을 미치는데, DTLS에서 조각화 및 재조립할 수 있는 것은 핸드셰이크 메시지뿐이기 때문입니다. 애플리케이션이 전송하는 다른 모든 메시지는 단일 데이터그램에 들어맞아야 합니다.

참고: DTLS 전용 헤더는 애플리케이션 데이터에 약간의 오버헤드를 추가하여 허용 가능한 메시지 크기를 더욱 줄입니다.

경고: HelloVerifyRequest로 응답하도록 구성된서버는 조각화된 모든 ClientHello 메시지를 거부하며, 핸드셰이크를 시작하지 않습니다.

DTLS 서버 및 DTLS 클라이언트 예제는 애플리케이션에서 QDtls를 사용하는 방법을 보여줍니다.

QUdpSocket, QDtlsClientVerifier, HandshakeState, QDtlsError 및 QSslConfiguration도 참조하십시오 .

멤버 유형 문서

[alias] QDtls::GeneratorParameters

enum QDtls::HandshakeState

DTLS 핸드셰이크의 현재 상태를 설명합니다.

이 열거형은 QDtls 연결에 대한 DTLS 핸드셰이크의 현재 상태를 설명합니다.

상수값설명
QDtls::HandshakeNotStarted0아직 아무 작업도 수행되지 않았습니다.
QDtls::HandshakeInProgress1핸드셰이크가 시작되었으며 지금까지 오류가 발견되지 않았습니다.
QDtls::PeerVerificationFailed2피어의 신원을 확인할 수 없습니다.
QDtls::HandshakeComplete3핸드셰이크가 성공적으로 완료되었고, 암호화된 연결이 설정되었습니다.

QDtls::doHandshake() 및 QDtls::handshakeState()도 참조하십시오 .

멤버 함수 문서

[explicit] QDtls::QDtls(QSslSocket::SslMode mode, QObject *parent = nullptr)

QDtls 객체를 생성하며, ` parent `가 ` QObject ` 생성자에 전달됩니다. ` mode `는 서버 측 DTLS 연결의 경우 ` QSslSocket::SslServerMode `이며, 클라이언트의 경우 ` QSslSocket::SslClientMode `입니다.

sslMode() 및 QSslSocket::SslMode도 참조하십시오 .

[virtual noexcept] QDtls::~QDtls()

QDtls 객체를 삭제합니다.

bool QDtls::abortHandshake(QUdpSocket *socket)

진행 중인 핸드셰이크를 중단합니다. socket 에서 핸드셰이크가 진행 중이었을 경우 true를 반환하고, 그렇지 않은 경우 적절한 오류 메시지를 설정하고 false를 반환합니다.

doHandshake() 및 resumeHandshake()도 참조하십시오 .

QDtls::GeneratorParameters QDtls::cookieGeneratorParameters() const

현재 사용 중인 해시 알고리즘과 시크릿을 반환합니다. 이는 기본값이거나, 이전에 ` setCookieGeneratorParameters()` 호출을 통해 설정된 값일 수 있습니다.

Qt가 이를 지원하도록 구성된 경우 기본 해시 알고리즘은 QCryptographicHash::Sha256 이며, 그렇지 않은 경우 QCryptographicHash::Sha1 입니다. 기본 시크릿은 백엔드별 암호학적으로 강력한 의사난수 생성기에서 얻어집니다.

QDtlsClientVerifier 및 setCookieGeneratorParameters()도 참조하십시오 .

QByteArray QDtls::decryptDatagram(QUdpSocket *socket, const QByteArray &dgram)

dgram 를 복호화하고 그 내용을 일반 텍스트로 반환합니다. 데이터그램을 복호화하려면 먼저 핸드셰이크가 완료되어야 합니다. TLS 메시지의 유형에 따라 연결이 socket 에 데이터를 기록할 수 있으며, 이 변수는 유효한 포인터여야 합니다.

bool QDtls::doHandshake(QUdpSocket *socket, const QByteArray &dgram = {})

DTLS 핸드셰이크를 시작하거나 계속합니다. ` socket `는 유효한 포인터여야 합니다. 서버 측 DTLS 핸드셰이크를 시작할 때, ` dgram `에는 ` QUdpSocket`에서 읽은 초기 `ClientHello` 메시지가 포함되어 있어야 합니다. 이 함수는 오류가 발견되지 않으면 ` true `를 반환합니다. 핸드셰이크 상태는 ` handshakeState()`를 사용하여 확인할 수 있습니다. ` false `가 반환되면 오류가 발생한 것이므로, 더 자세한 정보를 확인하려면 ` dtlsError()`를 사용하십시오.

참고: 상대방의 신원을 확인할 수 없는경우 , 오류는 QDtlsError::PeerVerificationError 로 설정됩니다. 검증 오류를 무시하고 연결을 계속하려면 ignoreVerificationErrors()을 호출한 다음 resumeHandshake()을 호출해야 합니다. 오류를 무시할 수 없는 경우, abortHandshake()을 호출해야 합니다.

if (!dtls.doHandshake(&socket, dgram)) {
    if (dtls.dtlsError() == QDtlsError::PeerVerificationError)
        dtls.abortAfterError(&socket);
}

handshakeState(), dtlsError(), ignoreVerificationErrors(), resumeHandshake() 및 abortHandshake()도 참조하십시오 .

QSslConfiguration QDtls::dtlsConfiguration() const

기본 DTLS 구성 또는 이전에 setDtlsConfiguration()를 호출하여 설정된 구성을 반환합니다.

setDtlsConfiguration() 및 QSslConfiguration::defaultDtlsConfiguration()도 참조하십시오 .

QDtlsError QDtls::dtlsError() const

연결에서 발생한 마지막 오류 또는 ` QDtlsError::NoError`를 반환합니다.

dtlsErrorString() 및 QDtlsError도 참조하십시오 .

QString QDtls::dtlsErrorString() const

연결에서 발생한 마지막 오류에 대한 설명 텍스트를 반환하거나 빈 문자열을 반환합니다.

dtlsError()도 참조하십시오 .

bool QDtls::handleTimeout(QUdpSocket *socket)

핸드셰이크 도중 타임아웃이 발생하면 handshakeTimeout() 신호가 발생합니다. 애플리케이션은 handleTimeout()을 호출하여 핸드셰이크 메시지를 재전송해야 합니다. handleTimeout()은 타임아웃이 발생한 경우 true 을 반환하고, 그렇지 않은 경우 false를 반환합니다. socket 는 유효한 포인터여야 합니다.

handshakeTimeout()도 참조하십시오 .

QDtls::HandshakeState QDtls::handshakeState() const

이 QDtls 의 현재 핸드셰이크 상태를 반환합니다.

doHandshake() 및 QDtls::HandshakeState도 참조하십시오 .

[signal] void QDtls::handshakeTimeout()

패킷 손실은 핸드셰이크 단계에서 타임아웃을 유발할 수 있습니다. 이 경우 ` QDtls `는 `handshakeTimeout()` 신호를 발생시킵니다. 핸드셰이크 메시지를 재전송하려면 ` handleTimeout()`를 호출하십시오:

DtlsClient::DtlsClient()
{
    // Some initialization code here ...
    connect(&clientDtls, &QDtls::handshakeTimeout, this, &DtlsClient::handleTimeout);
}

void DtlsClient::handleTimeout()
{
    clientDtls.handleTimeout(&clientSocket);
}

handleTimeout()도 참조하십시오 .

void QDtls::ignoreVerificationErrors(const QList<QSslError> &errorsToIgnore)

이 방법은 QDtls 에 errorsToIgnore 에 명시된 오류만 무시하도록 지시합니다.

예를 들어, 자체 서명된 인증서를 사용하는 서버에 연결하려는 경우 다음 코드 조각을 참고하십시오:

QList<QSslCertificate> cert = QSslCertificate::fromPath("server-certificate.pem"_L1);
QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
QList<QSslError> expectedSslErrors;
expectedSslErrors.append(error);

QDtls dtls;
dtls.ignoreVerificationErrors(expectedSslErrors);
dtls.doHandshake(udpSocket);

또한 doHandshake()에서 QDtlsError::PeerVerificationError 오류가 발생한 후에 이 함수를 호출한 다음, resumeHandshake()를 호출하여 핸드셰이크를 재개할 수도 있습니다.

이후 이 함수를 호출하면 이전 호출에서 전달된 오류 목록이 대체됩니다. 빈 목록을 사용하여 이 함수를 호출하면 무시하려는 오류 목록을 지울 수 있습니다.

doHandshake(), resumeHandshake(), QSslError도 참조하십시오 .

bool QDtls::isConnectionEncrypted() const

DTLS 핸드셰이크가 성공적으로 완료되면 true 를 반환합니다.

doHandshake() 및 handshakeState()도 참조하십시오 .

quint16 QDtls::mtuHint() const

setMtuHint() 함수를 통해 이전에 설정된 값을 반환합니다. 기본값은 0입니다.

setMtuHint()도 참조하십시오 .

QHostAddress QDtls::peerAddress() const

setPeer() 또는 QHostAddress::Null 를 통해 설정된 피어의 주소를 반환합니다.

setPeer()도 참조하십시오 .

quint16 QDtls::peerPort() const

setPeer() 함수를 통해 설정된 피어의 포트 번호 또는 0을 반환합니다.

setPeer()도 참조하십시오 .

QList<QSslError> QDtls::peerVerificationErrors() const

피어의 신원을 확인하는 과정에서 발견된 오류를 반환합니다.

발생한 오류에도 불구하고 연결을 계속하려면 ` ignoreVerificationErrors()`를 호출해야 합니다.

QString QDtls::peerVerificationName() const

setPeer() 또는 setPeerVerificationName() 함수로 설정된 호스트 이름을 반환합니다. 기본값은 빈 문자열입니다.

setPeerVerificationName() 및 setPeer()도 참조하십시오 .

[signal] void QDtls::pskRequired(QSslPreSharedKeyAuthenticator *authenticator)

QDtls PSK 암호 모음을 협상할 때 이 신호를 전송하며, 따라서 이후 PSK 인증이 필요합니다.

PSK를 사용할 때, TLS 핸드셰이크를 계속 진행하려면 클라이언트가 서버에 유효한 신원 정보와 유효한 사전 공유 키를 전송해야 합니다. 애플리케이션은 이 신호에 연결된 슬롯을 통해, 전달된 ` authenticator ` 객체를 필요에 따라 채움으로써 이 정보를 제공할 수 있습니다.

참고: 이 신호를무시하거나 필요한 인증 정보를 제공하지 못하면 핸드셰이크가 실패하고, 결과적으로 연결이 중단됩니다.

참고: ` authenticator `객체는 ` QDtls `가 소유하고 있으므로, 애플리케이션에서 이 객체를 삭제해서는 안 됩니다.

참조: QSslPreSharedKeyAuthenticator.

bool QDtls::resumeHandshake(QUdpSocket *socket)

핸드셰이크 과정에서 피어 검증 오류가 무시된 경우, resumeHandshake()는 핸드셰이크를 재개하여 완료하고 true 를 반환합니다. socket 는 유효한 포인터여야 합니다. 핸드셰이크를 재개할 수 없는 경우 false 를 반환합니다.

doHandshake(), abortHandshake(), peerVerificationErrors(), ignoreVerificationErrors()도 참조하십시오 .

QSslCipher QDtls::sessionCipher() const

이 연결에서 사용되는 암호화 cipher 를 반환하며, 연결이 암호화되지 않은 경우에는 null cipher를 반환합니다. 세션에 사용될 cipher는 핸드셰이크 단계에서 선택됩니다. 이 cipher는 데이터를 암호화하고 복호화하는 데 사용됩니다.

QSslConfiguration 핸드셰이크 단계에서 최종적으로 세션 암호를 선택하게 될 암호들의 정렬된 목록을 설정하는 함수를 제공합니다. 이 정렬된 목록은 핸드셰이크 단계가 시작되기 전에 준비되어 있어야 합니다.

QSslConfiguration, setDtlsConfiguration() 및 dtlsConfiguration()도 참조하십시오 .

QSsl::SslProtocol QDtls::sessionProtocol() const

이 연결에서 사용되는 DTLS 프로토콜 버전을 반환하며, 연결이 아직 암호화되지 않은 경우에는 UnknownProtocol을 반환합니다. 연결에 사용될 프로토콜은 핸드셰이크 단계에서 선택됩니다.

setDtlsConfiguration()는 핸드셰이크가 시작되기 전에 선호하는 버전을 설정할 수 있습니다.

setDtlsConfiguration(), QSslConfiguration, QSslConfiguration::defaultDtlsConfiguration() 및 QSslConfiguration::setProtocol()도 참조하십시오 .

bool QDtls::setCookieGeneratorParameters(const QDtls::GeneratorParameters &params)

params 에서 암호화 해시 알고리즘과 비밀 키를 설정합니다. 이 함수는 서버 측 QDtls 연결에만 필요합니다. 성공하면 true 를 반환합니다.

참고: 이 함수는 핸드셰이크가 시작되기 전에 호출해야 합니다.

cookieGeneratorParameters(), doHandshake(), QDtlsClientVerifier 및 QDtlsClientVerifier::cookieGeneratorParameters()도 참조하십시오 .

bool QDtls::setDtlsConfiguration(const QSslConfiguration &configuration)

configuration 에서 연결의 TLS 구성을 설정하며, 성공 시 true 를 반환합니다.

참고: 이 함수는 핸드셰이크가 시작되기 전에 호출되어야 합니다.

dtlsConfiguration() 및 doHandshake()도 참조하십시오 .

void QDtls::setMtuHint(quint16 mtuHint)

mtuHint 이는 애플리케이션이 탐지하거나 추정한 최대 전송 단위(MTU)입니다. 애플리케이션은 이 값을 반드시 설정해야 하는 것은 아닙니다.

mtuHint() 및 QAbstractSocket::PathMtuSocketOption도 참조하십시오 .

bool QDtls::setPeer(const QHostAddress &address, quint16 port, const QString &verificationName = {})

피어의 주소( port)와 호스트 이름을 설정하고, 성공 시 true 를 반환합니다. address 는 null이거나 멀티캐스트, 브로드캐스트 주소여서는 안 됩니다. verificationName 는 인증서 유효성 검사에 사용되는 호스트 이름입니다.

peerAddress(), peerPort(), peerVerificationName()도 참조하십시오 .

bool QDtls::setPeerVerificationName(const QString &name)

인증서 유효성 검사에 사용될 호스트 name 를 설정하고, 성공 시 true 를 반환합니다.

참고: 이 함수는 핸드셰이크가 시작되기 전에 호출되어야 합니다.

peerVerificationName() 및 setPeer()도 참조하십시오 .

bool QDtls::shutdown(QUdpSocket *socket)

암호화된 종료 알림 메시지를 전송하고 DTLS 연결을 종료합니다. 핸드셰이크 상태가 ‘ QDtls::HandshakeNotStarted ’로 변경됩니다. ` socket `는 유효한 포인터여야 합니다. 이 함수는 성공 시 ` true `를 반환합니다.

doHandshake()도 참조하십시오 .

QSslSocket::SslMode QDtls::sslMode() const

서버 측 연결의 경우 QSslSocket::SslServerMode 를, 클라이언트 측 연결의 경우 QSslSocket::SslClientMode 를 반환합니다.

QDtls() 및 QSslSocket::SslMode도 참조하십시오 .

qint64 QDtls::writeDatagramEncrypted(QUdpSocket *socket, const QByteArray &dgram)

dgram 를 암호화하고, 암호화된 데이터를 socket 에 기록합니다. 기록된 바이트 수를 반환하며, 오류가 발생한 경우 -1을 반환합니다. 암호화된 데이터를 기록하기 전에 핸드셰이크가 완료되어야 합니다. socket 는 유효한 포인터여야 합니다.

doHandshake(), handshakeState(), isConnectionEncrypted(), dtlsError()도 참조하십시오 .

관련 비회원 함수

enum class QDtlsError

QDtls 및 QDtlsClientVerifier 에서 발견될 수 있는 오류를 설명합니다.

이 열거형은 QDtlsClientVerifier 및 QDtls 클래스의 객체에서 발생할 수 있는 일반 오류와 TLS 관련 오류를 설명합니다.

상수값설명
QDtls::QDtlsError::NoError0오류가 발생하지 않았으며, 마지막 작업이 성공했습니다.
QDtls::QDtlsError::InvalidInputParameters1호출자가 제공한 입력 매개 변수가 유효하지 않습니다.
QDtls::QDtlsError::InvalidOperation2허용되지 않는 상태에서 작업이 시도되었습니다.
QDtls::QDtlsError::UnderlyingSocketError3QUdpSocket::writeDatagram()가 실패했으며, QUdpSocket::error() 및 QUdpSocket::errorString()에서 더 구체적인 정보를 확인할 수 있습니다.
QDtls::QDtlsError::RemoteClosedConnectionError4TLS 종료 경고 메시지가 수신되었습니다.
QDtls::QDtlsError::PeerVerificationError5TLS 핸드셰이크 중에 피어의 신원을 확인할 수 없었습니다.
QDtls::QDtlsError::TlsInitializationError6기본 TLS 백엔드를 초기화하는 동안 오류가 발생했습니다.
QDtls::QDtlsError::TlsFatalError7피어 확인 오류나 TLS 초기화 오류 이외의 치명적인 오류가 TLS 핸드셰이크 중에 발생했습니다.
QDtls::QDtlsError::TlsNonFatalError8데이터그램의 암호화 또는 복호화에 실패했습니다. 치명적이지 않은 오류이므로, 이 오류 발생 후에도 QDtls 은 계속 작동할 수 있습니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.