QUdpSocket Class

QUdpSocketクラスはUDPソケットを提供します。詳細...

Header: #include <QUdpSocket>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
Inherits: QAbstractSocket

注意:このクラスの関数はすべてリエントラントです。

パブリック関数

QUdpSocket(QObject *parent = nullptr)
virtual ~QUdpSocket()
bool hasPendingDatagrams() const
bool joinMulticastGroup(const QHostAddress &groupAddress)
bool joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
bool leaveMulticastGroup(const QHostAddress &groupAddress)
bool leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
QNetworkInterface multicastInterface() const
qint64 pendingDatagramSize() const
qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
QNetworkDatagram receiveDatagram(qint64 maxSize = -1)
void setMulticastInterface(const QNetworkInterface &iface)
qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
qint64 writeDatagram(const QNetworkDatagram &datagram)
qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

詳細説明

UDP (User Datagram Protocol) は軽量で信頼性の低いデータグラム指向のコネクションレス・プロトコルです。信頼性が重要でない場合に使用できる。QUdpSocketはQAbstractSocket のサブクラスで、UDPデータグラムを送受信できます。

このクラスを使用する最も一般的な方法は、bind ()を使用してアドレスとポートにバインドし、writeDatagram ()とreadDatagram ()/receiveDatagram ()を呼び出してデータを転送することです。QIODevice の標準関数read(),readLine(),write() などを使いたい場合は、まずconnectToHost() を呼び出してソケットを直接ピアに接続する必要がある。

ソケットは、データグラムがネットワークに書き込まれるたびにbytesWritten() シグナルを発する。データグラムを送信するだけであれば、bind() を呼び出す必要はない。

readyRead() シグナルは、データグラムが到着するたびに発せられる。この場合、hasPendingDatagrams() はtrue を返す。pendingDatagramSize()を呼び出して保留中の最初のデータグラムのサイズを取得し、readDatagram()またはreceiveDatagram()を呼び出して読み込む。

注意: 受信データグラムは、readyRead ()シグナルを受信したときに読み込むべ きである。そうしないと、このシグナルは次のデータグラムに対して発せられない。

void Server::initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 7755);

    connect(udpSocket, &QUdpSocket::readyRead,
            this, &Server::readPendingDatagrams);
}

void Server::readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QNetworkDatagram datagram = udpSocket->receiveDatagram();
        processTheDatagram(datagram);
    }
}

QUdpSocketはUDPマルチキャストもサポートしている。joinMulticastGroup() とleaveMulticastGroup() を使用してグループ・メンバーシップを制御し、QAbstractSocket::MulticastTtlOptionQAbstractSocket::MulticastLoopbackOption を使用してTTLとループバック・ソケット・オプションを設定する。マルチキャスト・データグラムの送信インタフェースの制御にはsetMulticastInterface()を、問い合わせにはmulticastInterface() を使用する。

QUdpSocketを使用すると、connectToHost ()を使用してUDPサーバーへの仮想接続を確立し、read ()とwrite ()を使用して、各データグラムの受信者を指定せずにデータグラムを交換することもできる。

Broadcast SenderBroadcast ReceiverMulticast SenderMulticast Receiverの例は、アプリケーションでQUdpSocketを使用する方法を示しています。

QTcpSocket およびQNetworkDatagramも参照のこと

メンバ関数ドキュメント

[explicit] QUdpSocket::QUdpSocket(QObject *parent = nullptr)

QUdpSocketオブジェクトを作成します。

parent は コンストラクタに渡されます。QObject

socketType()も参照

[virtual noexcept] QUdpSocket::~QUdpSocket()

ソケットを破棄し、必要であれば接続を閉じる。

close() も参照

bool QUdpSocket::hasPendingDatagrams() const

少なくとも1つのデータグラムが読み込み待ちであればtrue を返し、そうでなければfalse を返す。

pendingDatagramSize() およびreadDatagram() も参照の こと。

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

オペレーティングシステムが選択したデフォルトインターフェース上のgroupAddress で指定されたマルチキャストグループに参加する。ソケットが BoundState でなければならない。

IPv4 グループに参加する場合、ソケットを IPv6 でバインドしてはならない(デュアルモードではQHostAddress::Any を使用する)。代わりにQHostAddress::AnyIPv4 を使用しなければならない。

成功した場合はtrue を返し、失敗した場合はfalse を返し、それに応じてソケットエラーを設定する。

注意: インタフェースを選択せずにIPv6マルチキャストグループに参加することは、すべてのオペレーティ ングシステムでサポートされていない。インターフェースを指定するオーバーロードの使用を考慮すること。

leaveMulticastGroup()も参照のこと

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)

これはオーバーロードされた関数である。

インターフェイスiface 上のマルチキャストグループアドレスgroupAddress に参加します。

leaveMulticastGroup() も参照の こと。

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

groupAddress で指定されたマルチキャストグループから、オペレーティングシステムが選択したデフォルトの インタフェース上に離脱する。ソケットが BoundState でなければならない。

成功した場合はtrue を返し、失敗した場合はfalse を返し、それに応じてソケットエラーを設定する。

注意: この関数はjoinMulticastGroup() に渡された引数と同じ引数を指定して呼び出さなければならない。

joinMulticastGroup()も参照のこと

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)

これはオーバーロードされた関数である。

iface インタフェース上のgroupAddress で指定されたマルチキャストグループから抜ける。

注意: この関数は、joinMulticastGroup() に渡されたものと同じ引数で呼び出す必要がある。

joinMulticastGroup()も参照

QNetworkInterface QUdpSocket::multicastInterface() const

マルチキャスト・データグラムの送信インタフェースを返す。IPv4 ソケットの IP_MULTICAST_IF ソケットオプション、IPv6 ソケットの IPV6_MULTICAST_IF ソケットオプションに対応する。QNetworkInterfaceソケットが BoundState 状態でなければならず、そうでなければ無効なQNetworkInterface が返される。

setMulticastInterface()も参照のこと

qint64 QUdpSocket::pendingDatagramSize() const

保留中の最初のUDPデータグラムのサイズを返す。利用可能なデータグラムがない場合、この関数は -1 を返す。

hasPendingDatagrams()およびreadDatagram()も参照の こと。

qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)

maxSize バイト以下のデータグラムを受信し、それをdata に格納する。送信者のホスト・アドレスとポートは、 *address と *port に格納される(ポインタがnullptr である場合を除く)。

成功すればデータグラムのサイズを返し、そうでなければ-1を返す。

maxSize が小さすぎる場合、データグラムの残りは失われる。データの損失を避けるには、pendingDatagramSize() をコールして、保留中のデータグラムのサイズを決定してから、 読み込みを試みること。maxSize が 0 の場合、データグラムは破棄される。

writeDatagram()、hasPendingDatagrams()、pendingDatagramSize()も参照のこと

QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)

maxSize バイト以下のデータグラムを受信し、送信者のホストアドレスとポートとともにQNetworkDatagram オブジェクトに返す。可能であれば、この関数は受信時にデータグラムの宛先アドレス、ポート、ホップ数を決定することも試みる。

失敗すると、not valid を報告するQNetworkDatagram を返す。

maxSize が小さすぎる場合、データグラムの残りは失われる。maxSize が0の場合、データグラムは破棄される。maxSize が-1(デフォルト)の場合、この関数はデータグラム全体の読み取りを試みる。

writeDatagram()、hasPendingDatagrams()、pendingDatagramSize()も参照のこと

void QUdpSocket::setMulticastInterface(const QNetworkInterface &iface)

マルチキャスト・データグラムの送信インタフェースをインタフェースiface に設定する。IPv4 ソケットの IP_MULTICAST_IF ソケットオプション、IPv6 ソケットの IPV6_MULTICAST_IF ソケットオプションに対応する。ソケットは BoundState でなければならない。

multicastInterface(),joinMulticastGroup(),leaveMulticastGroup()も参照のこと

qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)

サイズsizedata のデータグラムを、ポートport のホストアドレスaddress に送信する。成功すれば送信バイト数を返し、そうでなければ -1 を返す。

データグラムは常に1ブロックとして書き込まれる。データグラムの最大サイズはプラットフォームに大きく依存するが、 8192バイトまで可能である。データグラムが大きすぎる場合、この関数は-1を返し、error() はDatagramTooLargeErrorを返す。

512バイトより大きなデータグラムを送信することは、一般的に不利である。たとえ正常に送信されたとしても、最終的な宛先に到着する前にIPレイヤによってフラグメント化される可能性が高いからである。

警告 警告: 接続されたUDPソケットでこの関数を呼び出すと、エラーになりパケットが送信されないことがある。接続されたソケットを使用している場合、write() を使用してデータグラムを送信する。

readDatagram() およびwrite()も参照のこと

qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)

これはオーバーロードされた関数である。

データグラムdatagramdatagram に含まれるホストアドレスとポート番号に送信する。宛先アドレスとポート番号が未設定の場合、この関数はconnectToHost() に渡されたアドレスに送信する。

宛先アドレスがIPv6で、scope id が空でないが、datagram のインタフェースインデックスと異なる場合、オペレーティングシステムがどのインタフェースで送信するかは未定義である。

この関数は、成功した場合は送信したバイト数を返し、エラーが発生した場合は -1 を返す。

警告 警告: 接続されているUDPソケットでこの関数を呼び出すと、エラーになりパケットが送信されないことがある。接続されたソケットを使用している場合は、write() を使用してデータグラムを送信する。

QNetworkDatagram::setDestination(),QNetworkDatagram::setHopLimit(),QNetworkDatagram::setInterfaceIndex()も参照のこと

qint64 QUdpSocket::writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

これはオーバーロードされた関数である。

データグラムdatagram をホストアドレスhost とポートport に送信する。

この関数は、成功した場合は送信したバイト数を返し、エラーが発生した場合は -1 を返します。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。