QNetworkDatagram Class
QNetworkDatagramクラスは、UDPデータグラムのデータとメタデータを提供する。詳細...
Header: | #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では、このフィールドは通常「time to live」- 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::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)にリセットされる;
新しいデータグラムのホップ数の制限はデフォルト(-1)にリセットされます;QNetworkDatagram が将来のバージョンのQtでさらにメタデータを運ぶように変更された場合、この関数はそのメタデータを適切にコピーします。
IPv4ブロードキャストアドレスと通常のIPv4アドレスは、このマシンに割り当てられているすべてのアドレスを徹底的に検索しなければ見分けることができないため、このデータグラムの宛先アドレスがIPv4アドレスの場合はコピーされない。送信者アドレスがブロードキャストアドレスと等しいデータグラムを送信しようとすると、失敗する可能性が高い。しかし、複数のIPv4アドレスを持つネットワークインターフェースは珍しいので、オペレーティングシステムが選択するアドレスは、おそらく相手が理解できるものであるため、通信には影響しないはずである。
注: この関数にはrvalue参照とlvalue参照の両方の修飾子オーバーロードがあるため、makeReply を呼び出す前に、できればこのオブジェクトがrvalueであることを確認しておくと、ムーブのセマンティクスをより有効に利用できる。これを実現するには、上記の例を使用します:
udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));
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パケットの有効期限が切れてデータグラムの送信者にエラーが送り返される前に、その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 オブジェクトが有効であれば真を返す。有効なQNetworkDatagram オブジェクトには、少なくとも 1 つの送信者アドレスまたは受信者アドレスが含まれる。有効なデータグラムは、空のペイロードを含むことができる。
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 に設定されているスコープIDが異なり、どちらも0でない場合、オペレーティングシステムがどのインターフェイスでデータグラムを送信するかは未定義である。
interfaceIndex() および setInterfaceIndex()も参照のこと 。
void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)
このデータグラムに関連付けられた送信者アドレスをアドレスaddress 、ポート番号port に設定する。送信者アドレスとポート番号は通常、受信時にQUdpSocket によって設定されるので、受信したデータグラムに対してこの関数を呼び出す必要はない。
送信データグラムの場合、この関数は、データグラムが伝送すべきアドレスを設定する ために使用できる。アドレスaddress は通常、このマシンに割り当てられているローカルアドレスの1つでなければならない。このアドレスは、QNetworkInterface を使用して取得できる。未設定の場合、オペレーティング・システムは、その宛先から最も適切なアドレスを選択する。
ポート番号port はソケットに関連付けられたポート番号でなければならない。0 を指定すると、オペレーティングシステムがポート番号を選択する。
QUdpSocket::writeDatagram()、senderAddress()、senderPort()、setDestination()も参照のこと 。
[noexcept]
void QNetworkDatagram::swap(QNetworkDatagram &other)
このインスタンスをother と交換する。
QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)
ペイロードとメタデータを含むother データグラムをコピーする。
返信で送信するのに適したデータグラムを作成するには、QNetworkDatagram::makeReply() を使用します;
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。