QNetworkDatagram Class
QNetworkDatagram クラスは、UDP データグラムのデータおよびメタデータを提供します。詳細...
| ヘッダー: | #include <QNetworkDatagram> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake: | QT += network |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- QNetworkDatagramは、ネットワークプログラミングAPIの一部です。
注:このクラスのすべての関数は再入可能です。
パブリック関数
| 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)」と呼ばれます);
- データグラムを受信した、または送信するネットワークインターフェースのインデックス。
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をサポートするその他のUnix | IPv6のみ | 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では、この値は通常「タイム・トゥ・ライブ」(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 オブジェクトには、少なくとも1つの送信元アドレスまたは受信先アドレスが含まれています。有効なデータグラムには、空のペイロードが含まれていても構いません。
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 XML のバージョンで、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では、この値は通常「タイム・トゥ・ライブ(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.