Spec-Zone.ru › Qt 5.12

Класс 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)
  • 37 общедоступных функций, унаследованных от QAbstractSocket
  • 44 общедоступных функций, унаследованных от QIODevice
  • 31 общедоступных функций, унаследованных от QObject

Статические общедоступные члены

const QMetaObject staticMetaObject
  • 9 статических общедоступных членов, унаследованных от QObject

Дополнительные унаследованные члены

  • 1 свойство, унаследованное от QObject
  • 1 общедоступный слот, унаследованный от QObject
  • 6 сигналов, унаследованных от QAbstractSocket
  • 6 сигналов, унаследованных от QIODevice
  • 2 сигнала, унаследованных от QObject
  • 10 защищенных функций, унаследованных от QAbstractSocket
  • 5 защищенных функций, унаследованных от QIODevice
  • 9 защищенных функций, унаследованных от QObject

Подробное описание

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

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.12/qudpsocket.html

Spec-Zone.ru

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