В Qt библиотека QUdpSocket предоставляет простой и мощный способ работы с протоколом UDP — одним из основных способов передачи данных по сети. В отличие от TCP, UDP не устанавливает соединения и не гарантирует доставку пакетов, зато работает быстрее и проще. В этой статье мы рассмотрим, как использовать QUdpSocket для отправки и приёма UDP-пакетов.
Что такое UDP?
UDP (User Datagram Protocol) — это «легковесный» сетевой протокол, который:
- не устанавливает соединение,
- не подтверждает получение пакетов,
- подходит для задач, где важна скорость (видео, игры, телеметрия).
Подключение QUdpSocket
Перед началом не забудьте подключить модуль Qt Network в .pro файле:
QT += network
Пример: отправка и приём UDP-пакета
Создадим простой пример на QUdpSocket, который может:
- отправлять сообщение по UDP,
- принимать входящие UDP-пакеты.
Получение UDP-пакетов
// udpserver.h
#include <QObject>
#include <QUdpSocket>
class UdpServer : public QObject
{
Q_OBJECT
public:
explicit UdpServer(QObject *parent = nullptr);
private slots:
void processPendingDatagrams();
private:
QUdpSocket *socket;
};
// udpserver.cpp
#include "udpserver.h"
#include <QDebug>
UdpServer::UdpServer(QObject *parent) : QObject(parent)
{
socket = new QUdpSocket(this);
socket->bind(QHostAddress::Any, 12345); // Привязка к порту 12345
connect(socket, &QUdpSocket::readyRead, this, &UdpServer::processPendingDatagrams);
}
void UdpServer::processPendingDatagrams()
{
while (socket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
qDebug() << "Получено:" << datagram << "от" << sender.toString() << ":" << senderPort;
}
}
Отправка UDP-пакета
// udpsender.cpp
#include <QUdpSocket>
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QUdpSocket socket;
QByteArray data = "Привет по UDP!";
socket.writeDatagram(data, QHostAddress::LocalHost, 12345);
return a.exec();
}
Полезные методы QUdpSocket
| Метод | Назначение |
|---|---|
bind() | Привязка к IP и порту для прослушивания |
writeDatagram() | Отправка пакета |
readDatagram() | Чтение одного пакета |
hasPendingDatagrams() | Проверка, есть ли входящие пакеты |
pendingDatagramSize() | Размер следующего пакета |
abort() | Закрытие текущей сессии |
Примеры использования
Где применяют QUdpSocket:
- Онлайн-игры (обмен данными между игроками)
- Системы телеметрии и мониторинга
- Видео- и аудиостриминг
- Устройства Интернета вещей (IoT)
Советы
- UDP не гарантирует порядок и доставку — если это критично, используйте
QTcpSocket. - Используйте
QUdpSocket::bind(QHostAddress::AnyIPv4, порт, ShareAddress)— если хотите принимать пакеты от нескольких отправителей. - Если получаете данные на
localhost, убедитесь, что файрвол не блокирует порт.
Заключение
QUdpSocket — мощный инструмент для работы с сетевыми UDP-соединениями в Qt. Он прост в использовании и отлично подходит для задач, где важна скорость, а не гарантия доставки.
