Как сделать UDP «клиентом» в Qt чтобы он получал данные с сервера?

Итак, сервер UDP, по-видимому, просто прослушивает некоторые порты и обрабатывает байтовые массивы, которые поставляются с IP и PORT источника:

// In this code, listener is QUdpSocket*
FileServer::FileServer(QObject *parent)
: QObject(parent)
, listener(new QUdpSocket(this))
{
// bind to listening port
listener->bind(QHostAddress::Any, 6660);

connect(listener, &QUdpSocket::readyRead,
this, &FileServer::readPendingDatagrams, Qt::QueuedConnection);
}

void FileServer::readPendingDatagrams()
{
while (listener->hasPendingDatagrams()) {
// This is how this is done in new QT
//QNetworkDatagram datagram = listener->receiveDatagram();
//processTheDatagram(datagram);
// This is how it is done in old QT
QByteArray datagram;
datagram.resize(listener->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;

listener->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
processDatagram(datagram, sender, senderPort);
}
}

Очень хорошо. Это на самом деле работает, как я убедился, используя этот фрагмент кода Python:

import socket
host="127.0.0.1"port=6660
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_sock.sendto(b'PING', (host, port))

Массив байтов даже содержит «PING». Итак, я собирался написать клиент. Я предполагаю, что клиент просто отправит данные, используя QUdpSocket::sendDatagram, Но как он может получать данные?

Сначала я думал, что я позвоню bind(SERVER_ADDRESS_HERE, 6660), Но очевидно, что они не могут одновременно слушать один и тот же порт.

Итак, как мне написать клиент для сервера выше?

0

Решение

Вы можете использовать сигнал readyread () сокета для выполнения слота при получении данных:

//put this in the MainWindow costructor
connect(socket, SIGNAL(readyread()), SLOT(slot()));

Не забудьте сделать привязку, чтобы начать получать данные из порта:

//this is the code to make the bind
socket->bind(port);

В слоте вы можете написать этот код, который сохраняет в QString то, что вы получаете:

void MainWindow::slot(){

QString data = "";
while(socket->hasPendingDatagrams()) {

QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
QHostAddress senderIP;
quint64 senderPort;
socket->readDatagram(datagram.data(), datagram.size(), &senderIP, &senderPort);

//if you want to check if the sender was the server you can control senderIp

data += QString(datagram);
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]