Класс 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 (если указатели не nullptr).
Возвращает размер датаграммы при успехе; в противном случае возвращает -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.15/qudpsocket.html