QudpSocket

Автор: | 23 июля, 2019

UDP (User Datagram Protocol) — это легкий, ненадежный, ориентированный на дейтаграммы протокол без установления соединения. Его можно использовать, когда надежность не важна. QUdpSocket является подклассом QAbstractSocket, который позволяет отправлять и получать дейтаграммы UDP. Наиболее распространенным способом использования этого класса является привязка к адресу и порту с использованием bind(), а затем вызова  writeDatagram() и readDatagram() / receiveDatagram() для передачи данных. Сокет вызывает сигнал bytesWritten() каждый раз, когда дейтаграмма записывается в сеть. Для отправки дейтаграммы, необязательно вызывать bind(). Сигнал readyRead() вызываются когда получены дейтаграммы. В этом случае hasPendingDatagrams() возвращает true. Вызвав pendingDatagramSize(), чтобы получить размер первой ожидающей дейтаграммы, и readDatagram или receiveDatagram(), чтобы прочитать ее.

Пример использования QudpSocket

Рассмотрим фрагмент кода для отправки дейтаграммы:

void initSocket()
{
  udpSocket = new QUdpSocket(this);
}


void sendPendingDatagrams( QByteArray & data )
{
 QNetworkDatagram  datagram;
 datagram.setDestination(QHostAddress::LocalHost, 8877);
 datagram.setData(data);
 udpSocket->writeDatagram(datagram);
}

Рассмотрим фрагмент кода для получения дейтаграммы:

void initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 7788);
    connect(udpSocket, SIGANL(readyRead()), this, SLOT(readPendingDatagrams()));
}

void readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QNetworkDatagram datagram = udpSocket->receiveDatagram();
        processTheDatagram(datagram);
    }
}

void processTheDatagram(QNetworkDatagram & datagram)
{
  qDebug() << datagram.data();
}