feat:新增组播

Video_Medical
wanghaoyu 4 weeks ago
parent 8725cf2da6
commit e2bf903a68

@ -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");

@ -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,6 +24,9 @@ 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))
{
@ -47,6 +56,11 @@ void CUdpSocket::setTargetInfo(QString ip, quint16 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,6 +71,24 @@ 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<QString, quint16> CUdpSocket::getSenderIPSetting()
{
return qMakePair(m_localIP, m_localPort);
}
void CUdpSocket::on_readyReadData()
{
//通过函数判断当前是否有等待读取的数据并循环获取
@ -65,8 +97,9 @@ void CUdpSocket::on_readyReadData()
//创建数据存储容器,并设置长度为将接收的数据长度
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);
}

@ -4,6 +4,7 @@
#include <QObject>
#include <QUdpSocket>
#include <QHostAddress>
#include <QPair>
class CUdpSocket : public QObject
{ Q_OBJECT
public:
@ -22,6 +23,11 @@ public:
//关闭socket
bool close();
//加入组播
bool joinMulticast();
//获取发送者的IP及端口号
QPair<QString, quint16> getSenderIPSetting();
signals:
//通过该信号传递接收到的数据
void recvDataSignal(QString data);
@ -31,10 +37,16 @@ public slots:
void on_readyReadData();
private:
QUdpSocket* m_sock; //UDP套接字指针
QUdpSocket* m_sock{nullptr}; //UDP套接字指针
QHostAddress m_hostAddr; //保存目标的地址对象
quint16 m_port; //保存目标的端口号(类型一致)
quint16 m_port{0}; //保存目标的端口号(类型一致)
QString m_localIP{""}; //本地IP
QHostAddress m_localAddr; //保存本地的地址对象
quint16 m_localPort{0}; //保存本地的端口号(类型一致)
QHostAddress senderIP; //发送者IP
quint16 senderPort{0}; //发送者端口号
bool isSocketBind{false}; //数据绑定成功or失败
};

Loading…
Cancel
Save