QUdpSocket 类

QUdpSocket 类提供 UDP (用户数据报协议) 套接字。 更多...

头: #include <QUdpSocket>
CMake: find_package(Qt6 COMPONENTS Network REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
继承: 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 (用户数据报协议) 是轻量、不可靠、面向数据报的无连接协议。可以使用它,当可靠性不重要时。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::MulticastTtlOption and QAbstractSocket::MulticastLoopbackOption 去设置 TTL (生存时间) 和回送套接字选项。使用 setMulticastInterface () 去控制多点播送数据报的传出接口,和 multicastInterface () 去查询它。

采用 QUdpSocket,还可以建立到 UDP 服务器的虚拟连接使用 connectToHost () 然后使用 read () 和 write () 去交换数据,不为每数据报指定接收者。

广播发送器 , 广播接收器 , 多点播送发送器 ,和 多点播送接收器 范例阐明如何在应用程序中使用 QUdpSocket。

另请参阅 QTcpSocket and QNetworkDatagram .

成员函数文档编制

QUdpSocket:: QUdpSocket ( QObject * parent = nullptr)

创建 QUdpSocket 对象。

parent 被传递给 QObject 构造函数。

另请参阅 socketType ().

[虚拟] QUdpSocket:: ~QUdpSocket ()

销毁套接字,关闭连接 (若有必要)。

另请参阅 close ().

bool QUdpSocket:: hasPendingDatagrams () const

返回 true 若至少有一数据报等待被读取;否则返回 false .

另请参阅 pendingDatagramSize () 和 readDatagram ().

bool QUdpSocket:: joinMulticastGroup (const QHostAddress & groupAddress )

加入多点播送组指定通过 groupAddress on the default interface chosen by the operating system. The socket must be in BoundState, otherwise an error occurs.

注意,如果试图加入 IPv4 组,套接字不得使用 IPv6 绑定 (或在双模式下,使用 QHostAddress::Any )。必须使用 QHostAddress::AnyIPv4 代替。

此函数返回 true 若成功;否则,返回 false 并设置相应套接字错误。

注意: Joining IPv6 multicast groups without an interface selection is not supported in all operating systems. Consider using the overload where the interface is specified.

另请参阅 leaveMulticastGroup ().

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

这是重载函数。

加入多点播送组地址 groupAddress 按接口 iface .

另请参阅 leaveMulticastGroup ().

bool QUdpSocket:: leaveMulticastGroup (const QHostAddress & groupAddress )

离开多点播送组指定通过 groupAddress on the default interface chosen by the operating system. The socket must be in BoundState, otherwise an error occurs.

此函数返回 true 若成功;否则,返回 false 并设置相应套接字错误。

注意: This function should be called with the same arguments as were passed to joinMulticastGroup ().

另请参阅 joinMulticastGroup ().

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

这是重载函数。

离开多点播送组指定通过 groupAddress 按接口 iface .

注意: This function should be called with the same arguments as were passed to joinMulticastGroup ().

另请参阅 joinMulticastGroup ().

QNetworkInterface QUdpSocket:: multicastInterface () const

返回用于多点播送数据报的传出接口的接口。这相当于 IPv4 套接字的 IP_MULTICAST_IF 套接字选项和 IPv6 套接字的 IPV6_MULTICAST_IF 套接字选项。若先前没有设置接口,此函数返回无效 QNetworkInterface . The socket must be in BoundState, otherwise an invalid 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 (unless the pointers are nullptr ).

返回数据报的大小当成功时;否则返回 -1。

maxSize 太小,其余数据报将丢失。为避免数据丢失,调用 pendingDatagramSize () 以确定待决数据报的大小在试图读取它之前。若 maxSize 为 0,数据报会被丢弃。

另请参阅 writeDatagram (), hasPendingDatagrams (),和 pendingDatagramSize ().

[since 5.8] QNetworkDatagram QUdpSocket:: receiveDatagram ( qint64 maxSize = -1)

接收数据报不大于 maxSize 字节并返回它在 QNetworkDatagram 对象,除发送者的主机地址和端口外。若可能,此函数还会试着确定数据报的目的地地址、端口及接待时的跳跃计数。

当故障时,返回 QNetworkDatagram 报告 无效 .

maxSize 太小,其余数据报将丢失。若 maxSize 为 0,数据报会被丢弃。若 maxSize 为 -1 (默认),此函数将试图读取整个数据报。

该函数在 Qt 5.8 引入。

另请参阅 writeDatagram (), hasPendingDatagrams (),和 pendingDatagramSize ().

void QUdpSocket:: setMulticastInterface (const QNetworkInterface & iface )

将多点播送数据报的传出接口设为接口 iface . This corresponds to the IP_MULTICAST_IF socket option for IPv4 sockets and the IPV6_MULTICAST_IF socket option for IPv6 sockets. The socket must be in BoundState, otherwise this function does nothing.

另请参阅 multicastInterface (), joinMulticastGroup (),和 leaveMulticastGroup ().

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

发送数据报按 data 的大小 size 到主机地址 address 在端口 port 。返回发送字节数当成功时;否则返回 -1。

数据报始终作为一个块写入。数据报的最大大小高度从属平台,但可以低至 8192 字节。若数据报太大,此函数将返回 -1 和 error () will return DatagramTooLargeError.

一般不建议发送大于 512 字节的数据报,因为即使成功发送,它们也可能被 IP 层碎片化在抵达其最终目的地之前。

警告: 在已连接的 UDP 套接字中调用此函数,可能导致错误且不发送数据包。若正使用已连接的套接字,使用 write () 来发送数据报。

另请参阅 readDatagram () 和 write ().

[since 5.8] qint64 QUdpSocket:: writeDatagram (const QNetworkDatagram & datagram )

这是重载函数。

发送数据报 datagram 到主机地址和端口号包含在 datagram ,要使用的网络接口和跳跃计数限制也在那里设置。若未设置目的地地址和端口号,此函数将发送地址传递给 connectToHost ().

若目的地地址是 IPv6 采用非空 作用域 ID 但不同于接口索引在 datagram ,操作系统将选择发送哪个接口未定义。

函数返回发送字节数若成功,或 -1 若遭遇错误。

警告: 在已连接的 UDP 套接字中调用此函数,可能导致错误且不发送数据包。若正使用已连接的套接字,使用 write () 来发送数据报。

该函数在 Qt 5.8 引入。

另请参阅 QNetworkDatagram::setDestination (), QNetworkDatagram::setHopLimit (),和 QNetworkDatagram::setInterfaceIndex ().

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

这是重载函数。

发送数据报 datagram 到主机地址 host 和在端口 port .

函数返回发送字节数若成功,或 -1 若遭遇错误。