Spec-Zone.ru › Qt 5.13

Класс 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 (протокол пользовательских дейтаграмм) — лёгкий, ненадежный, ориентированный на дейтаграммы, бессоедочный протокол. Он может быть использован, когда надёжность не важна. 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() для обмена дейтаграммами, не указывая получателя для каждой дейтаграммы.

Примеры Отправитель широковещательных сообщений, Получатель широковещательных сообщений, Отправитель многоадресных сообщений и Получатель многоадресных сообщений иллюстрируют, как использовать 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 с ненулевым scope 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 в случае ошибки.

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

Spec-Zone.ru

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