Spec-Zone.ru › Qt 5.14

Класс QUdpSocket

Класс QUdpSocket предоставляет сокет UDP. Подробнее...

Заголовок: #include <QUdpSocket>
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 (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::MulticastTtlOption и QAbstractSocket::MulticastLoopbackOption для установки параметров TTL и обратной петли сокета. Используйте setMulticastInterface() для управления исходящим интерфейсом для мультивещательных дейтаграмм и multicastInterface() для запроса его.

С помощью QUdpSocket вы также можете установить виртуальное соединение с UDP-сервером, используя connectToHost(), а затем использовать read() и write() для обмена дейтаграммами без указания получателя для каждой дейтаграммы.

Примеры Broadcast Sender, Broadcast Receiver, Multicast Sender и Multicast Receiver демонстрируют использование QUdpSocket в приложениях.

См. также QTcpSocket и QNetworkDatagram.

Документация по функциям-членам

QUdpSocket::QUdpSocket(QObject *parent = nullptr)

Создаёт объект QUdpSocket.

parent передаётся конструктору QObject.

См. также socketType().

[virtual] QUdpSocket::~QUdpSocket()

Удаляет сокет, закрывая соединение при необходимости.

См. также close().

bool QUdpSocket::hasPendingDatagrams() const

Возвращает true , если хотя бы одна дейтаграмма ожидает чтения; в противном случае возвращает false.

См. также pendingDatagramSize() и readDatagram().

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

Подключается к группе мультивещания, указанной groupAddress, на интерфейсе по умолчанию, выбранном операционной системой. Сокет должен быть в состоянии BoundState, в противном случае произойдёт ошибка.

Обратите внимание, что если вы пытаетесь подключиться к IPv4-группе, ваш сокет не должен быть привязан к IPv6 (или в режиме двойной связи, используя QHostAddress::Any). Вместо этого нужно использовать QHostAddress::AnyIPv4.

Функция возвращает true , если успешно; в противном случае она возвращает false и устанавливает ошибку сокета соответствующим образом.

Примечание: Подключение к IPv6-группам мультивещания без выбора интерфейса не поддерживается во всех операционных системах. Рассмотрите использование перегрузки, где интерфейс указан.

Функция была введена в Qt 4.8.

См. также leaveMulticastGroup().

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

Это перегруженная функция.

Подключается к адресу мультивещания groupAddress на интерфейсе iface.

Функция была введена в Qt 4.8.

См. также leaveMulticastGroup().

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

Выходит из группы мультивещания, указанной groupAddress, на интерфейсе по умолчанию, выбранном операционной системой. Сокет должен быть в состоянии BoundState, в противном случае произойдёт ошибка.

Функция возвращает true , если успешно; в противном случае она возвращает false и устанавливает ошибку сокета соответствующим образом.

Примечание: Эта функция должна вызываться с теми же аргументами, что и при вызове joinMulticastGroup().

Функция была введена в Qt 4.8.

См. также joinMulticastGroup().

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

Это перегруженный метод.

Выходит из многоадресной группы, заданной groupAddress, на интерфейсе iface.

Примечание: Этот метод следует вызывать с теми же аргументами, что и при вызове joinMulticastGroup().

Этот метод был добавлен в Qt 4.8.

См. также joinMulticastGroup().

QNetworkInterface QUdpSocket::multicastInterface() const

Возвращает интерфейс для исходящего интерфейса для многоадресных данных. Это соответствует параметру сокета IP_MULTICAST_IF для сокетов IPv4 и параметру сокета IPV6_MULTICAST_IF для сокетов IPv6. Если ранее не был задан интерфейс, этот метод возвращает недопустимый QNetworkInterface. Сокет должен находиться в состоянии BoundState, в противном случае возвращается недопустимый QNetworkInterface.

Этот метод был добавлен в Qt 4.8.

См. также 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 (если указатели не равны 0).

Возвращает размер датаграммы при успехе; в противном случае возвращает -1.

Если maxSize слишком мал, остальная часть датаграммы будет потеряна. Чтобы избежать потери данных, вызовите pendingDatagramSize(), чтобы определить размер ожидающей датаграммы, прежде чем пытаться её прочитать. Если maxSize равен 0, датаграмма будет отброшена.

См. также writeDatagram(), hasPendingDatagrams() и pendingDatagramSize().

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. Это соответствует параметру сокета IP_MULTICAST_IF для сокетов IPv4 и параметру сокета IPV6_MULTICAST_IF для сокетов IPv6. Сокет должен находиться в состоянии BoundState, в противном случае этот метод ничего не делает.

Этот метод был добавлен в Qt 4.8.

См. также multicastInterface(), joinMulticastGroup() и leaveMulticastGroup().

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

Отправляет датаграмму по адресу data размером size хосту address по порту port. Возвращает количество отправленных байт при успехе; в противном случае возвращает -1.

Датаграммы всегда отправляются как один блок. Максимальный размер датаграммы сильно зависит от платформы, но может быть так мал, как 8192 байт. Если датаграмма слишком большая, этот метод вернет -1, и error() вернёт DatagramTooLargeError.

Отправка датаграмм размером более 512 байт в целом не рекомендуется, так как, даже если они будут отправлены успешно, их, вероятно, фрагментирует IP-уровень перед прибытием в пункт назначения.

Предупреждение: Вызов этого метода на сокете UDP с подключением может привести к ошибке и отсутствию отправки пакета. Если вы используете сокет с подключением, используйте write() для отправки датаграмм.

См. также readDatagram() и write().

qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)

Это перегруженный метод.

Отправляет датаграмму datagram по адресу хоста и номеру порта, содержащимся в datagram, используя сетевой интерфейс и ограничения по количеству переходов, также заданные там. Если адреса и номера портов назначения не заданы, этот метод отправит по адресу, который был передан в connectToHost().

Если адрес назначения является IPv6 с ненулевым идентификатором области, но отличается от индекса интерфейса в 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, если возникла ошибка.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qudpsocket.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API