이 페이지에서

QNetworkDatagram Class

QNetworkDatagram 클래스는 UDP 데이터그램의 데이터와 메타데이터를 제공합니다. 더 보기...

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

참고: 이 클래스의 모든 함수는 재진입 가능합니다.

공개 함수

QNetworkDatagram()
QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)
QNetworkDatagram(const QNetworkDatagram &other)
void clear()
QByteArray data() const
QHostAddress destinationAddress() const
int destinationPort() const
int hopLimit() const
uint interfaceIndex() const
bool isNull() const
bool isValid() const
QNetworkDatagram makeReply(const QByteArray &payload) &&
QNetworkDatagram makeReply(const QByteArray &payload) const &
QHostAddress senderAddress() const
int senderPort() const
void setData(const QByteArray &data)
void setDestination(const QHostAddress &address, quint16 port)
void setHopLimit(int count)
void setInterfaceIndex(uint index)
void setSender(const QHostAddress &address, quint16 port = 0)
void swap(QNetworkDatagram &other)
QNetworkDatagram &operator=(const QNetworkDatagram &other)

상세 설명

QNetworkDatagram은 QUdpSocket 클래스와 함께 사용하여 UDP(User Datagram Protocol) 데이터그램에 포함된 전체 정보를 나타낼 수 있습니다. QNetworkDatagram은 데이터그램의 다음 정보를 캡슐화합니다.

  • 페이로드 데이터;
  • 발신자 주소 및 포트 번호;
  • 수신자 주소 및 포트 번호;
  • 남은 홉 수 제한(IPv4에서는 이 필드를 일반적으로 “TTL(Time to Live)”이라고 함);
  • 데이터그램이 수신되거나 전송될 네트워크 인터페이스 인덱스.

QUdpSocket 모든 운영 체제에서 가능한 한 일관된 동작을 따르도록 노력하지만, 일부 운영 체제에서는 위의 메타데이터를 모두 얻을 수 없는 경우가 있습니다. QUdpSocket::writeDatagram()를 사용하여 전송할 때 데이터그램에 설정할 수 없는 메타데이터는 아무런 오류 메시지 없이 무시됩니다.

수신 시, senderAddress() 및 senderPort() 속성에는 데이터그램을 보낸 상대방의 주소와 포트가 포함되며, destinationAddress() 및 destinationPort()에는 데이터그램에 포함된 대상이 포함됩니다. 이는 대개 현재 머신의 로컬 주소이지만, IPv4 브로드캐스트 주소(예: "255.255.255.255")나 IPv4 또는 IPv6 멀티캐스트 주소일 수도 있습니다. 애플리케이션은 데이터그램이 유니캐스트 주소 지정을 통해 이 컴퓨터로 특별히 전송되었는지, 아니면 여러 목적지로 전송되었는지 확인하는 것이 유용할 수 있습니다.

전송 시, ` senderAddress()` 및 ` senderPort()`에는 전송 시 사용될 로컬 주소가 포함되어야 합니다. 발신자 주소는 이 시스템에 할당된 주소여야 하며, 이는 ` QNetworkInterface`를 사용하여 얻을 수 있고, 포트 번호는 소켓이 바인딩된 포트 번호여야 합니다. 두 필드 중 어느 하나라도 설정하지 않고 두면 운영 체제에서 기본값으로 채워집니다. destinationAddress() 및 destinationPort() 필드는 UDP 소켓이 현재 연결된 주소와 다른 대상 주소로 설정될 수 있습니다.

일반적으로 이전에 수신한 데이터그램에 대한 응답으로 데이터그램을 전송할 때, ` destinationAddress()`를 수신 데이터그램의 ` senderAddress()`로 설정하고, 포트 번호도 마찬가지로 설정합니다. 이러한 일반적인 과정을 용이하게 하기 위해 QNetworkDatagram은 ` makeReply()` 함수를 제공합니다.

hopCount() 함수는 수신된 데이터그램의 경우, 해당 패킷에 대한 남은 홉 수 제한을 포함합니다. 전송 시에는 설정할 홉 수 제한을 포함합니다. 대부분의 프로토콜은 이 값을 기본값으로 두고, 운영 체제가 사용할 최적의 값을 결정하도록 합니다. IPv4를 통한 멀티캐스팅에서는 종종 이 필드를 사용하여 멀티캐스트 그룹의 범위(링크 로컬, 조직 내 로컬 또는 전역)를 나타냅니다.

interfaceIndex() 함수는 패킷을 수신한 운영 체제 인터페이스의 인덱스를 포함합니다. 이 값은 QHostAddress::scopeId() 속성에 설정할 수 있는 값과 동일하며, QNetworkInterface::index() 속성과 일치합니다. 글로벌 주소로 패킷을 전송할 때는 운영 체제가 시스템 라우팅 테이블을 사용하여 올바른 인터페이스를 선택하므로 인터페이스 인덱스를 설정할 필요가 없습니다. 이 속성은 유니캐스트이든 멀티캐스트이든 상관없이 링크 로컬 목적지로 데이터그램을 전송할 때 중요합니다.

기능 지원

QNetworkDatagram의 일부 기능은 모든 운영 체제에서 지원되지 않습니다. 모든 시스템에서 지원되는 것은 원격 호스트(수신 패킷의 발신자 및 발신 패킷의 수신자)의 주소와 포트뿐입니다. 대부분의 운영 체제에서 다른 기능들은 IPv6에서만 지원됩니다. 소프트웨어는 실행 시점에 나머지 정보가 IPv4 주소에 대해 결정될 수 있는지 확인해야 합니다.

현재 지원되는 기능은 다음과 같습니다:

운영 체제로컬 주소홉 수인터페이스 인덱스
FreeBSD지원됨지원됨IPv6 전용
Linux지원됨지원됨지원됨
OS X지원됨지원됨IPv6 전용
RFC 3542를 지원하는 기타 UnixIPv6 전용IPv6 전용IPv6 전용
Windows (데스크톱)지원됨지원됨지원됨
Windows RT지원되지 않음지원되지 않음지원되지 않음

QUdpSocket 및 QNetworkInterface도 참조하십시오 .

멤버 함수 설명서

QNetworkDatagram::QNetworkDatagram()

페이로드 데이터가 없고 수신 주소가 정의되지 않은 QNetworkDatagram 객체를 생성합니다.

setData()를 사용하여 페이로드를 수정할 수 있으며, setDestination()를 사용하여 목적지 주소를 설정할 수 있습니다.

목적지 주소를 정의하지 않은 경우, QUdpSocket::writeDatagram()은 QUdpSocket::connectToHost()을 사용하여 마지막으로 연결된 주소로 데이터그램을 전송하려고 시도합니다.

QNetworkDatagram::QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)

QNetworkDatagram 객체를 생성하고, data 을 페이로드 데이터로 설정하며, destinationAddress 및 port 을 데이터그램의 수신 주소로 설정합니다.

QNetworkDatagram::QNetworkDatagram(const QNetworkDatagram &other)

other 데이터그램의 복사본을 생성하며, 여기에는 페이로드와 메타데이터가 포함됩니다.

응답으로 전송하기에 적합한 데이터그램을 생성하려면 QNetworkDatagram::makeReply()을 사용하십시오;

void QNetworkDatagram::clear()

이 QNetworkDatagram 객체의 페이로드 데이터와 메타데이터를 지우고, 이를 기본값으로 재설정합니다.

QByteArray QNetworkDatagram::data() const

이 데이터그램의 데이터 페이로드를 반환합니다. 네트워크에서 수신된 데이터그램의 경우, 이 값에는 해당 데이터그램의 페이로드가 포함됩니다. 발신 데이터그램의 경우, 이 값은 전송될 데이터그램 그 자체입니다.

데이터그램은 데이터 없이도 전송될 수 있으므로, 반환되는 ` QByteArray `가 비어 있을 수 있습니다.

setData()도 참조하십시오 .

QHostAddress QNetworkDatagram::destinationAddress() const

이 데이터그램과 관련된 목적지 주소를 반환합니다. 네트워크에서 수신된 데이터그램의 경우, 이는 상대 노드가 데이터그램을 보낸 주소이며, 이 주소는 이 시스템의 로컬 주소이거나 멀티캐스트 또는 브로드캐스트 주소일 수 있습니다. 발신 데이터그램의 경우, 이는 데이터그램이 전송되어야 할 주소입니다.

이 데이터그램에 목적지 주소가 설정되지 않은 경우, 반환된 객체는 ` QHostAddress::isNull()`에 대해 `true`를 반환합니다.

senderAddress(), destinationPort() 및 setDestination()도 참조하십시오 .

int QNetworkDatagram::destinationPort() const

이 데이터그램과 연관된 목적지의 포트 번호를 반환합니다. 네트워크에서 수신된 데이터그램의 경우, 이는 상대 노드가 데이터그램을 보낸 로컬 포트 번호입니다. 발신 데이터그램의 경우, 이는 데이터그램이 전송되어야 할 상대 포트입니다.

이 데이터그램에 목적지 주소가 연결되어 있지 않은 경우, 이 함수는 -1을 반환합니다.

destinationAddress(), senderPort(), setDestination()도 참조하십시오 .

int QNetworkDatagram::hopLimit() const

이 데이터그램과 관련된 홉 수 제한을 반환합니다. 홉 수 제한은 IP 패킷이 만료되어 데이터그램의 발신자에게 오류가 반환되기 전에 해당 패킷을 전달할 수 있는 노드의 수를 의미합니다. IPv4에서 이 값은 일반적으로 “Time to Live”(TTL)로 알려져 있습니다.

이 데이터그램이 네트워크에서 수신된 경우, 이 값은 수신 후 데이터그램의 남은 홉 수이며, 패킷을 전달한 각 노드마다 1씩 감소되었습니다. -1 값은 홉 제한 횟수를 확인할 수 없음을 나타냅니다.

이 데이터그램이 발신 데이터그램인 경우, 이는 전송 시 IP 헤더에 설정될 값입니다. -1 값은 운영 체제가 값을 선택해야 함을 나타냅니다.

setHopLimit()도 참조하십시오 .

uint QNetworkDatagram::interfaceIndex() const

이 데이터그램이 연결된 인터페이스 인덱스를 반환합니다. 인터페이스 인덱스는 운영 체제 내에서 네트워크 인터페이스를 고유하게 식별하는 양의 정수입니다. 이 숫자는 해당 인터페이스에 대해 ` QNetworkInterface::index()` 함수가 반환하는 값과 일치합니다.

이 데이터그램이 네트워크에서 수신된 경우, 이는 패킷이 수신된 인터페이스의 인덱스입니다. 이 데이터그램이 발신 데이터그램인 경우, 이는 데이터그램이 전송되어야 할 인터페이스의 인덱스입니다.

값이 0인 경우 인터페이스 인덱스를 알 수 없음을 나타냅니다.

setInterfaceIndex()도 참조하십시오 .

bool QNetworkDatagram::isNull() const

이 QNetworkDatagram 객체가 null인 경우 true를 반환합니다. 이 함수는 isValid() 함수와 반대되는 기능을 합니다.

bool QNetworkDatagram::isValid() const

이 QNetworkDatagram 객체가 유효한 경우 true를 반환합니다. 유효한 QNetworkDatagram 객체에는 최소한 하나의 발신자 또는 수신자 주소가 포함되어 있습니다. 유효한 데이터그램에는 빈 페이로드가 포함될 수 있습니다.

QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) &&

QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &

이 수신 데이터그램에 대한 응답을 나타내는 새로운 ` QNetworkDatagram ` 객체를 생성하고, 페이로드 데이터를 ` payload`으로 설정합니다. 이 함수는 데이터그램에 응답하여 원본 발신자에게 다시 전송하는 데 매우 편리한 방법입니다.

예시:

    void Server::readPendingDatagrams()
    {
        while (udpSocket->hasPendingDatagrams()) {
            QNetworkDatagram datagram = udpSocket->receiveDatagram();
            QByteArray replyData = processThePayload(datagram.data());
            udpSocket->writeDatagram(datagram.makeReply(replyData));
        }
    }

이 함수는 해당 데이터그램의 매개변수를 적절히 새로운 데이터그램으로 자동으로 복사해 주기 때문에 특히 편리합니다:

  • 이 데이터그램의 발신자 주소와 포트는 새 데이터그램의 수신자 주소와 포트로 복사됩니다.
  • 이 데이터그램의 인터페이스 인덱스(있는 경우)는 새 데이터그램의 인터페이스 인덱스로 복사됩니다;
  • 이 데이터그램의 수신자 주소와 포트는 해당 주소가 IPv6 글로벌(비멀티캐스트) 주소인 경우에만 새로운 데이터그램의 발신자 주소와 포트로 복사됩니다;
  • 새 데이터그램의 홉 수 제한은 기본값(-1)으로 재설정됩니다;

향후 Qt 버전에서 ` QNetworkDatagram `가 추가 메타데이터를 전달하도록 수정될 경우, 이 함수는 해당 메타데이터를 적절하게 복사합니다.

이 데이터그램의 목적지 주소가 IPv4 주소인 경우, 해당 컴퓨터에 할당된 모든 주소를 일일이 검색하지 않고서는 IPv4 브로드캐스트 주소와 일반 IPv4 주소를 구별할 수 없기 때문에 복사되지 않습니다. 발신자 주소를 브로드캐스트 주소와 동일하게 설정하여 데이터그램을 전송하려고 하면 실패할 가능성이 높습니다. 그러나 여러 개의 IPv4 주소를 가진 네트워크 인터페이스는 흔하지 않으므로, 운영 체제가 선택할 주소는 상대방이 이해할 수 있는 주소일 가능성이 높기 때문에 통신에는 영향을 미치지 않을 것입니다.

참고: 이 함수는 rvalue 및 lvalue 참조 한정자 오버로드를 모두 제공하므로, 이동 세미오틱스를 더 효과적으로 활용하기 위해 가능하면 ` makeReply`를 호출하기 전에 이 객체가 rvalue인지 확인하는 것이 좋습니다. 이를 위해 위 예제에서는 다음과 같이 작성할 수 있습니다:

    udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));

QHostAddress QNetworkDatagram::senderAddress() const

이 데이터그램과 연관된 발신자 주소를 반환합니다. 네트워크에서 수신된 데이터그램의 경우, 이는 해당 데이터그램을 전송한 피어 노드의 주소입니다. 발신 데이터그램의 경우, 이는 전송 시 사용될 로컬 주소입니다.

이 데이터그램에 발신자 주소가 설정되지 않은 경우, 반환된 객체는 ` QHostAddress::isNull()`에 `true`를 반환합니다.

destinationAddress(), senderPort, setSender도 참조하십시오 .

int QNetworkDatagram::senderPort() const

이 데이터그램과 연관된 발신자의 포트 번호를 반환합니다. 네트워크에서 수신된 데이터그램의 경우, 이는 상대 노드가 데이터그램을 전송한 포트 번호입니다. 발신 데이터그램의 경우, 이는 데이터그램이 전송되어야 할 로컬 포트입니다.

이 데이터그램에 발신자 주소가 연결되어 있지 않은 경우, 이 함수는 -1을 반환합니다.

senderAddress(), destinationPort(), setSender()도 참조하십시오 .

void QNetworkDatagram::setData(const QByteArray &data)

이 데이터그램의 데이터 페이로드를 ` data`로 설정합니다. 일반적으로 수신된 데이터그램에 대해 이 함수를 호출할 필요는 없습니다. 발신 데이터그램의 경우, 이 함수는 네트워크를 통해 전송될 데이터를 설정합니다.

데이터그램은 비어 있을 수 있으므로, 빈 QByteArray 값은 data 에 대한 유효한 값입니다.

data()도 참조하십시오 .

void QNetworkDatagram::setDestination(const QHostAddress &address, quint16 port)

이 데이터그램과 관련된 목적지 주소를 address, 포트 번호를 port 로 설정합니다. 목적지 주소와 포트 번호는 일반적으로 수신 시 QUdpSocket 에 의해 설정되므로, 수신된 데이터그램에 대해서는 이 함수를 호출할 필요가 없습니다.

발신 데이터그램의 경우, 이 함수를 사용하여 데이터그램이 전송될 주소를 설정할 수 있습니다. 이는 피어와 통신하는 데 사용되는 유니캐스트 주소이거나, 장치 그룹으로 전송하기 위한 브로드캐스트 또는 멀티캐스트 주소일 수 있습니다.

QUdpSocket::writeDatagram(), destinationAddress(), destinationPort(), setSender()도 참조하십시오 .

void QNetworkDatagram::setHopLimit(int count)

이 데이터그램과 관련된 홉 수 제한을 ` count`로 설정합니다. 홉 수 제한은 IP 패킷이 유효 기간이 만료되어 데이터그램의 발신자에게 오류가 반환되기 전까지 해당 패킷을 전달할 수 있는 노드의 수를 의미합니다. IPv4에서 이 값은 일반적으로 “유효 기간(Time to Live, TTL)”으로 알려져 있습니다.

일반적으로 네트워크에서 수신된 데이터그램에 대해 이 함수를 호출할 필요는 없습니다.

이 패킷이 발신 패킷인 경우, 이 값은 전송 시 IP 헤더에 설정되어야 하는 값입니다. 유효한 값의 범위는 1에서 255까지입니다. 또한 이 함수는 운영 체제가 값을 선택하도록 지시하기 위해 -1 값도 허용합니다.

hopLimit()함수도 참조하십시오 .

void QNetworkDatagram::setInterfaceIndex(uint index)

이 데이터그램이 연결된 인터페이스 인덱스를 ` index`로 설정합니다. 인터페이스 인덱스는 운영 체제에서 네트워크 인터페이스를 고유하게 식별하는 양의 정수입니다. 이 숫자는 해당 인터페이스에 대해 ` QNetworkInterface::index()` 함수가 반환하는 값과 일치합니다.

일반적으로 네트워크에서 수신된 데이터그램에 대해 이 함수를 호출할 필요는 없습니다.

이 패킷이 발신 패킷인 경우, 이 값은 데이터그램이 전송되어야 할 인터페이스의 인덱스입니다. 0 값은 운영 체제가 다른 요소를 바탕으로 인터페이스를 선택해야 함을 나타냅니다.

IPv6 목적지 주소의 경우 QHostAddress::setScopeId()를 사용하여 인터페이스 인덱스를 설정한 다음, setDestination()를 호출할 수도 있습니다. 목적지 주소에 설정된 범위 ID와 index 가 서로 다르고 둘 다 0이 아닌 경우, 운영 체제가 어떤 인터페이스를 통해 데이터그램을 전송할지는 정의되지 않습니다.

interfaceIndex()도 참조하십시오 .

void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)

이 데이터그램과 관련된 발신자 주소를 address, 포트 번호를 port 로 설정합니다. 발신자 주소와 포트 번호는 일반적으로 수신 시 QUdpSocket 에 의해 설정되므로, 수신된 데이터그램에 대해서는 이 함수를 호출할 필요가 없습니다.

발신 데이터그램의 경우, 이 함수를 사용하여 데이터그램이 전달해야 할 주소를 설정할 수 있습니다. 주소 address 는 일반적으로 이 컴퓨터에 할당된 로컬 주소 중 하나여야 하며, QNetworkInterface 를 사용하여 확인할 수 있습니다. 설정하지 않은 경우, 운영 체제는 해당 목적지에 따라 가장 적합한 주소를 선택합니다.

포트 번호 port 는 해당 소켓에 할당된 포트 번호가 있는 경우, 그 번호여야 합니다. 값 0을 사용하면 운영 체제가 포트 번호를 선택하도록 지시할 수 있습니다.

QUdpSocket::writeDatagram(), senderAddress(), senderPort() 및 setDestination()도 참조하십시오 .

[noexcept] void QNetworkDatagram::swap(QNetworkDatagram &other)

이 데이터그램을 other 와 교환합니다. 이 작업은 매우 빠르며 절대 실패하지 않습니다.

QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)

other 데이터그램을 페이로드와 메타데이터를 포함하여 복사합니다.

응답으로 전송하기에 적합한 데이터그램을 생성하려면 QNetworkDatagram::makeReply()을 사용하십시오.

© 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.