You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.8 KiB
C++

3 months ago
#include "udpsocketworker.h"
#include "common.h"
UdpSocketWorker::UdpSocketWorker(const QHostAddress hostAddr, const int port, QObject *parent)
: QObject(parent)
, m_udpSocket(new QUdpSocket(this))
{
m_udpSocket->bind(hostAddr, port);
connect(m_udpSocket, &QUdpSocket::readyRead, this, &UdpSocketWorker::processPendingDatagrams);
}
UdpSocketWorker::~UdpSocketWorker()
{
m_udpSocket->close();
qDeleteAll(m_timers); // 清理所有动态创建的定时器
}
void UdpSocketWorker::sendData(const QByteArray &data, const QHostAddress &address, quint16 port)
{
m_udpSocket->writeDatagram(data, address, port);
}
void UdpSocketWorker::processPendingDatagrams()
{
while (m_udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(static_cast<int>(m_udpSocket->pendingDatagramSize()));
m_udpSocket->readDatagram(datagram.data(), datagram.size());
emit dataReceived(datagram);
}
}
void UdpSocketWorker::startSending(const QString &id, const QByteArray &data, const QHostAddress &address, const quint16 port, int interval)
{
if (m_timers.contains(id))
{
stopSending(id); // 如果存在相同ID的定时器先停止
}
QTimer *timer = new QTimer(this); // 创建新的定时器
m_timers[id] = timer;
m_dataToSend[id] = data;
m_targetAddress[id] = address;
connect(timer, &QTimer::timeout, this, [=]() {
sendData(m_dataToSend[id], m_targetAddress[id], port);
});
timer->start(interval);
}
void UdpSocketWorker::stopSending(const QString &id)
{
if (m_timers.contains(id)) {
QTimer *timer = m_timers.take(id);
timer->stop();
timer->deleteLater(); // 删除定时器对象
m_dataToSend.remove(id);
m_targetAddress.remove(id);
}
}