QDtls Class
이 클래스는 UDP 소켓에 대한 암호화를 제공합니다. 더 보기...
헤더: | #include <QDtls> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
qmake: | QT += network |
상속합니다: | QObject |
- 상속된 멤버를 포함한 모든 멤버 목록
- QDtls는 네트워크 프로그래밍 API의 일부입니다.
공용 유형
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 ¶ms) |
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) |
Signals
void | handshakeTimeout() |
void | pskRequired(QSslPreSharedKeyAuthenticator *authenticator) |
관련 비회원
enum class | QDtlsError { NoError, InvalidInputParameters, InvalidOperation, UnderlyingSocketError, RemoteClosedConnectionError, …, TlsNonFatalError } |
상세 설명
QDtls 클래스는 사용자 데이터그램 프로토콜(UDP)을 사용하여 네트워크 피어와 보안 연결을 설정하는 데 사용할 수 있습니다. 본질적으로 연결이 필요 없는 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 핸드셰이크의 현재 상태를 설명합니다.
Constant | 값 | 설명 |
---|---|---|
QDtls::HandshakeNotStarted | 0 | 아직 완료되지 않았습니다. |
QDtls::HandshakeInProgress | 1 | 핸드셰이크가 시작되었고 지금까지 오류가 발견되지 않았습니다. |
QDtls::PeerVerificationFailed | 2 | 상대방의 신원을 확인할 수 없습니다. |
QDtls::HandshakeComplete | 3 | 핸드셰이크가 성공적으로 완료되었으며 암호화된 연결이 설정되었습니다. |
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 에서 진행 중이면 참을 반환하고, 그렇지 않으면 적절한 오류를 설정하고 거짓을 반환합니다.
doHandshake() 및 resumeHandshake()도 참조하세요 .
QDtls::GeneratorParameters QDtls::cookieGeneratorParameters() const
기본 해시 알고리즘 또는 setCookieGeneratorParameters() 호출로 이전에 설정한 현재 해시 알고리즘과 비밀을 반환합니다.
기본 해시 알고리즘은 Qt XML이 이를 지원하도록 구성된 경우 QCryptographicHash::Sha256, 그렇지 않은 경우 QCryptographicHash::Sha1 입니다. 기본 비밀은 백엔드 전용 암호학적으로 강력한 의사 난수 생성기에서 얻습니다.
setCookieGeneratorParameters(), QDtlsClientVerifier, 쿠키제너레이터 파라미터()도 참조하세요 .
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() 신호가 전송됩니다. 애플리케이션은 핸들타임아웃()을 호출하여 핸드셰이크 메시지를 재전송해야 합니다. 핸들타임아웃()은 시간 초과가 발생하면 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를 사용할 때 클라이언트는 유효한 ID와 유효한 사전 공유 키를 서버에 보내야 TLS 핸드셰이크를 계속할 수 있습니다. 애플리케이션은 필요에 따라 전달된 authenticator 객체를 채워 이 신호에 연결된 슬롯에 이 정보를 제공할 수 있습니다.
참고: 이 신호를 무시하거나 필요한 자격 증명을 제공하지 않으면 핸드셰이크가 실패하여 연결이 중단됩니다.
참고: authenticator 객체는 QDtls 소유이며 애플리케이션에서 삭제해서는 안 됩니다.
QSslPreSharedKeyAuthenticator도 참조하세요 .
bool QDtls::resumeHandshake(QUdpSocket *socket)
핸드셰이크 도중 피어 확인 오류가 무시된 경우 resumeHandshake()는 핸드셰이크를 재개하고 완료한 후 true
을 반환합니다. socket 은 유효한 포인터여야 합니다. 핸드셰이크를 재개할 수 없는 경우 false
을 반환합니다.
doHandshake(), abortHandshake(), peerVerificationErrors() 및 ignoreVerificationErrors()도 참조하세요 .
QSslCipher QDtls::sessionCipher() const
이 연결에 사용된 cipher 암호를 반환하거나 연결이 암호화되지 않은 경우 null 암호를 반환합니다. 세션의 암호는 핸드셰이크 단계에서 선택됩니다. 이 암호는 데이터를 암호화하고 해독하는 데 사용됩니다.
QSslConfiguration 는 핸드셰이크 단계에서 최종적으로 세션 암호를 선택할 암호의 순서 목록을 설정하는 기능을 제공합니다. 핸드셰이크 단계가 시작되기 전에 이 정렬된 목록이 준비되어 있어야 합니다.
QSslConfiguration, setDtlsConfiguration() 및 dtlsConfiguration()도 참조하세요 .
QSsl::SslProtocol QDtls::sessionProtocol() const
이 연결에 사용된 DTLS 프로토콜 버전을 반환하거나 연결이 아직 암호화되지 않은 경우 UnknownProtocol을 반환합니다. 연결의 프로토콜은 핸드셰이크 단계에서 선택됩니다.
setDtlsConfiguration()는 핸드셰이크가 시작되기 전에 선호하는 버전을 설정할 수 있습니다.
setDtlsConfiguration(), QSslConfiguration, QSslConfiguration::defaultDtlsConfiguration() 및 QSslConfiguration::setProtocol()도 참조하세요 .
bool QDtls::setCookieGeneratorParameters(const QDtls::GeneratorParameters ¶ms)
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 관련 오류를 설명합니다.
Constant | 값 | 설명 |
---|---|---|
QDtls::QDtlsError::NoError | 0 | 오류가 발생하지 않았으며, 마지막 작업이 성공했습니다. |
QDtls::QDtlsError::InvalidInputParameters | 1 | 호출자가 제공한 입력 매개변수가 유효하지 않습니다. |
QDtls::QDtlsError::InvalidOperation | 2 | 허용되지 않는 상태에서 작업을 시도했습니다. |
QDtls::QDtlsError::UnderlyingSocketError | 3 | QUdpSocket::writeDatagram() 실패, QUdpSocket::error() 및 QUdpSocket::errorString()에서 보다 구체적인 정보를 확인할 수 있습니다. |
QDtls::QDtlsError::RemoteClosedConnectionError | 4 | TLS 종료 경고 메시지를 받았습니다. |
QDtls::QDtlsError::PeerVerificationError | 5 | TLS 핸드셰이크 중에 피어의 신원을 확인할 수 없습니다. |
QDtls::QDtlsError::TlsInitializationError | 6 | 기본 TLS 백엔드를 초기화하는 동안 오류가 발생했습니다. |
QDtls::QDtlsError::TlsFatalError | 7 | TLS 핸드셰이크 중에 피어 확인 오류 또는 TLS 초기화 오류 이외의 치명적인 오류가 발생했습니다. |
QDtls::QDtlsError::TlsNonFatalError | 8 | 치명적이지 않은 데이터그램 암호화 또는 암호 해독 실패로, 이 오류 후에도 QDtls 계속 작동할 수 있습니다. |
© 2025 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.