Работа с QUdpSocket в Qt: UDP-сокеты просто и понятно

Автор: | 15 июня, 2025

В 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. Он прост в использовании и отлично подходит для задач, где важна скорость, а не гарантия доставки.