diff --git a/src/commandwidget.cpp b/src/commandwidget.cpp index 1a9ddcf..5dcdc25 100644 --- a/src/commandwidget.cpp +++ b/src/commandwidget.cpp @@ -490,6 +490,11 @@ void CommandWidget::setPodIPConfig(NetworkIPStruct networkIP, bool isConnect) qDebug() << "端口号绑定失败"; } + if (!m_CUdpSocket->joinMulticast()) + { + qDebug() << "加入组播失败"; + } + //绑定目标IP Port m_CUdpSocket->setTargetInfo(networkIP.remoteIP, networkIP.remotePort); } @@ -526,14 +531,6 @@ void CommandWidget::setStopTracking() /***武汉天进吊舱控制***/ void CommandWidget::initmUdpParam() { - if (!m_CUdpSocket->bind("172.10.0.249", 10001)) - { - qDebug() << "端口号绑定失败"; - } - - //绑定目标IP Port - m_CUdpSocket->setTargetInfo("172.10.0.249", 10000); - QIntValidator* validator = new QIntValidator(0, 100, this); ui->cmdLineEdit->setValidator(validator); ui->cmdLineEdit->setText("40"); diff --git a/src/utils/CUdpSocket.cpp b/src/utils/CUdpSocket.cpp index c256dcb..00fb730 100644 --- a/src/utils/CUdpSocket.cpp +++ b/src/utils/CUdpSocket.cpp @@ -1,4 +1,5 @@ #include "CUdpSocket.h" +#include "../global.h" CUdpSocket::CUdpSocket(QObject* parent) : QObject(parent) { @@ -10,6 +11,11 @@ CUdpSocket::CUdpSocket(QObject* parent) : QObject(parent) CUdpSocket::~CUdpSocket() { + //离开所有加入的组播组 + if (m_sock->state() == QAbstractSocket::BoundState) { + m_sock->leaveMulticastGroup(m_hostAddr); + } + // 释放UDP套接字内存空间 m_sock->close(); delete m_sock; @@ -18,7 +24,10 @@ CUdpSocket::~CUdpSocket() bool CUdpSocket::bind(QString ip, ushort port) { // 返回绑定函数返回值 - + m_localIP = ip; + m_localAddr = QHostAddress(ip); + m_localPort = port; + if (!m_sock->bind(QHostAddress(ip), port)) { qDebug() << "Bind failed:" << m_sock->errorString(); @@ -40,13 +49,18 @@ void CUdpSocket::sendData(QByteArray data) void CUdpSocket::setTargetInfo(QString ip, quint16 port) { - // 存储传入的IP和端口号 + //存储传入的IP和端口号 m_hostAddr = QHostAddress(ip); m_port = port; } bool CUdpSocket::close() { + //离开所有加入的组播组 + if (m_sock->state() == QAbstractSocket::BoundState) { + m_sock->leaveMulticastGroup(m_hostAddr); + } + m_sock->close(); if (m_sock->state() == QUdpSocket::UnconnectedState) { qDebug() << "Socket 已成功关闭"; @@ -57,16 +71,35 @@ bool CUdpSocket::close() return false; } +bool CUdpSocket::joinMulticast() +{ + bool a = isMulticastAddress(m_localIP); + + if (m_localIP.isNull() || !isMulticastAddress(m_localIP)) { return false; } + + if (!m_sock->joinMulticastGroup(m_localAddr)) { + qDebug() << "Join multicast group failed:" << m_sock->errorString(); + return false; + } + return true; +} + +QPair CUdpSocket::getSenderIPSetting() +{ + return qMakePair(m_localIP, m_localPort); +} + void CUdpSocket::on_readyReadData() { - // 通过函数判断当前是否有等待读取的数据并循环获取 + //通过函数判断当前是否有等待读取的数据并循环获取 while (m_sock->hasPendingDatagrams()) { //创建数据存储容器,并设置长度为将接收的数据长度 QByteArray data; data.resize(m_sock->pendingDatagramSize()); + //读取数据并保存信息发送者的地址和ip(方便发送时指定发送位置) - m_sock->readDatagram(data.data(), data.size(), &m_hostAddr, &m_port); + m_sock->readDatagram(data.data(), data.size(), &senderIP, &senderPort); //发送接收数据的信号 emit recvDataSignal(data); } diff --git a/src/utils/CUdpSocket.h b/src/utils/CUdpSocket.h index 5d4865d..83278f7 100644 --- a/src/utils/CUdpSocket.h +++ b/src/utils/CUdpSocket.h @@ -4,6 +4,7 @@ #include #include #include +#include class CUdpSocket : public QObject { Q_OBJECT public: @@ -22,6 +23,11 @@ public: //关闭socket bool close(); + //加入组播 + bool joinMulticast(); + + //获取发送者的IP及端口号 + QPair getSenderIPSetting(); signals: //通过该信号传递接收到的数据 void recvDataSignal(QString data); @@ -31,11 +37,17 @@ public slots: void on_readyReadData(); private: - QUdpSocket* m_sock; //UDP套接字指针 - QHostAddress m_hostAddr; //保存目标的地址对象 - quint16 m_port; //保存目标的端口号(类型一致) + QUdpSocket* m_sock{nullptr}; //UDP套接字指针 + QHostAddress m_hostAddr; //保存目标的地址对象 + quint16 m_port{0}; //保存目标的端口号(类型一致) + + QString m_localIP{""}; //本地IP + QHostAddress m_localAddr; //保存本地的地址对象 + quint16 m_localPort{0}; //保存本地的端口号(类型一致) - bool isSocketBind{false}; //数据绑定成功or失败 + QHostAddress senderIP; //发送者IP + quint16 senderPort{0}; //发送者端口号 + bool isSocketBind{false}; //数据绑定成功or失败 }; #endif \ No newline at end of file